[[20091210092804]] 『定数式が必要です』(めんとす) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『定数式が必要です』(めんとす)
 標準モジュールの先頭に
 Option Explicit
 Public Const csv_path As String = ThisWorkbook.Path

 .Pathの部分定数式が必要です。
 とエラーしますが、どう言う意味でしょうか)


 >Public Const csv_path As String = ThisWorkbook.Path
                                    ^^^^^^^^^^^^^^^^^
                                        ↑
             これじゃぁ定数にならない、実行コード?なので。

 ↓使った事が無いけど、これはありみたい。
 Const ab As Long = 5
 Const st As Long = ab + 10

 Sub aaaaa()
 MsgBox st
 End Sub
 BJ

 定数は最初から決まっている値で、
 ThisWorkbook.Path は、その都度変わるプロパティなので定数として入れられません。
 Public変数に割り当てるのでしたら、標準モジュールならAuto_Openプロシージャで
 値をセットするとかで対応されてはどうでしょう?

 Option Explicit
 Public csv_path As String

 Private Sub Auto_Open()
   csv_path = ThisWorkbook.Path
 End Sub

 (momo)

 理由がわかりました、ありがとうございます。
 Public Constで定義すると、他のマクロで構文エラーとか起こしても
 内容は消えませんが、
 Private Sub Auto_Open()
   csv_path = ThisWorkbook.Path
 とすると、publicで宣言しても消えてしまいます。
 絶対に消えては困るものは、それぞれのプログラム開始時に再定義
 csv_path = ThisWorkbook.Pathを実行する必要がある。 
 と言う事で良いでしょうか?
 (めんとす)


 >絶対に消えては困るものは、それぞれのプログラム開始時に再定義
 >csv_path = ThisWorkbook.Pathを実行する必要がある。
 意味が良く解りませんが、PCの違い、媒体の違い、OSの違いで、
 パスは変わったりする時があるので、ファイルのパスを定数で宣言しようと、
 思う所がちょっと・・・・。
 と、思ったりします。
 BJ

 消えて困るものは非表示の作業シートを使ってセルに書き込んでおいたりします。
 Publicで定義したからと言って、ずっと消えないとは限りません。
 色々なタイミングで変数が開放されてしまう事があるのでおすすめしません。
 BJさんが仰るように、自ブックのパス程度でしたら変数にしなくても良いのでは?
 と思います。
 (momo)

 >絶対に消えては困るものは、それぞれのプログラム開始時に再定義
 >csv_path = ThisWorkbook.Pathを実行する必要がある。

 ThisWorkbook.Pathなら、その都度ThisWorkbook.Pathと記述すれば良いではないか とも思いますが、
 大きいプログラムになると、この記述さえも面倒になることがありますね!!
 記述が面倒なら、

 Function mypath() As String
    mypath = ThisWorkbook.Path
 End Function

 こんな関数を作っておいて運用は

 sub test()
  msgbox mypath
 end sub

 でもよさそうですが・・・、そうではなく、

 ThisWorkbook.Pathは、一例にすぎず、実際は、取得に結構時間のかかる
 データなので、どこかに保存しておきたいというなら、安全は、セルに保存することです。
 他には DocumentPropertyを使う方法も考えられます。

 一例ですが、

 Sub test1()
    Call mk_cdp("mph", msoPropertyTypeString, ThisWorkbook.Path)
    MsgBox get_cdp("mph").Value
 End Sub
 7=======================================================================
 Function mk_cdp(pnm As Variant, mytype As MsoDocProperties, myvalue)
    On Error Resume Next
    ThisWorkbook.CustomDocumentProperties.Add pnm, False, mytype, myvalue
    mk_cdp = Err.Number
    On Error GoTo 0
 End Function
 '======================================================================
 Function get_cdp(pnm As String) As DocumentProperty
    Dim cp As DocumentProperty
    On Error Resume Next
    Set get_cdp = Nothing
    Set get_cdp = ThisWorkbook.CustomDocumentProperties(pnm)
    On Error GoTo 0
 End Function

 ichinose


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.