2009年3月8日日曜日

○第110回目 計算式から場所情報を取得できないか(その4)

○第110回目 計算式から場所情報を取得できないか(その4)

 計算式の中の項目の場所へ飛ぶために、計算式から場所情報を取得できないか、というテーマの続きのです。関数名、演算子などの削除すべき文字列を、エクセルマクロの中で削除することにします。
 今回のテーマは、もととなる計算式から、シート名、座標をとりだすことのです。

 削除する文字列群、カンマなどに置き換える文字列群を区分けします。配列変数に文字列を指定して、For Next文で繰り返します。
 これによって、カンマなどで区切られた文字列が出来上がりますので、その文字列を取得し、シート名がないものは、当該シート名を付加して配列変数に格納します。
 
 del_mojis(i)の文字列を削除し、カンマに置き換える処理は次の通りとなります。
 del_mojis(i)の文字列を削除するだけの場合は、最後の式中、『& ","』の部分をなくします。
For i = 1 To ll100
If del_mojis(i) <> "" Then
Do While 1
p1 = InStr(b, del_mojis(i))
If p1 = 0 Then Exit Do
b = Left$(b, p1 - 1) & "," & Mid$(b, p1 + Len(del_mojis(i)))
Loop
End If
Next
 想定外の文字列がある場合は、後の処理でエラーになりますので、またここに戻って、不要な文字列を削除するなりしてください。
【削除または置き換える文字列】
"ROUND"、"LOOKUP"、"IF"、"INT"、"SUMPRODUCT"
四則演算記号、括弧など

 このように、求めたものから、変数名を取得します。カンマに挟まれたものが変数の候補です。p_xy_A1(i)に格納しておきます。

 次に、取得した情報が定数か否かを判定します。定数は不要ですので。
 定数は、If IsNumeric(変数名が入る) <> False で判定します。

 その次は、シート名がついているか否かです。これは"!"のありなしで判断します。あれば、分割し、シート名と座標を分離します。ない場合は、座標のみですので、シート名として当該シート名を貼付けます。
p1 = InStr(p_xy_A1(i), "!")
If p1 <> 0 Then
p_sh_name(i) = Left(p_xy_A1(i), p1 - 1)
p_xy_A1(i) = Mid(p_xy_A1(i), p1 + 1)
 シート名がない場合は、当該シート名をつけます。
p_sh_name(i) = ActiveSheet.Name
 シート名と座標は一緒にして使うことがありますので、結合したものとして、
p_mm0(i) = p_sh_name(i) & " --- " & p_xy_A1(i) としておきます。
 また、同じ項目が計算式中に複数記述されている場合がありますので、重複した分は削除して、詰めておきます。
 このようにして整理した後の、場所の数を把握しておきます。p_xy_no。
 この配列変数は共通なので前の処理で何が入っているのかわかりませんので、場所の数以上の内容はクリアすることを忘れずに。
 場所の情報が取得できましたので、このあとは、コンボボックスを呼び出して、その中から座標を選択して、その場所に移動するという今まで処理につながります。

0 件のコメント: