Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7988 / 13645 ツリー ←次へ | 前へ→

【35635】引数に配列を使った計算 たけぞう 06/3/8(水) 20:28 質問[未読]
【35645】Re:引数に配列を使った計算 ichinose 06/3/8(水) 22:32 発言[未読]
【35652】Re:引数に配列を使った計算 たけぞう 06/3/9(木) 8:45 お礼[未読]
【35656】セルのColorIndexでVlookupを選択 たけぞう 06/3/9(木) 11:37 質問[未読]
【35669】Re:セルのColorIndexでVlookupを選択 ichinose 06/3/9(木) 19:49 発言[未読]
【35686】Re:セルのColorIndexでVlookupを選択 たけぞう 06/3/10(金) 11:04 お礼[未読]

【35635】引数に配列を使った計算
質問  たけぞう  - 06/3/8(水) 20:28 -

引用なし
パスワード
   たけぞうです。配列について教えてください。
先ずは、私が理解しやすいようにモデルを簡単にしました。

1.A1セルに文字列を入力します。
2.B1セルに =hairetu_BBB(A1)を入力して、B1セルに
   1行2列の配列を返します。
3.C1セルに =hairetu_CCC(B1)を入力して、C1セルの値を得ます。

過去ログを調べて =hairetu_BBB(A1) について作成しましたが、L_Bの値が格納されているかわかりません。また、=hairetu_CCC(B1)でB1の値を上手く取り込めなくて困っています。どうぞよろしくお願いします。

Function hairetu_BBB(AAAA As String)
  Dim Buf As Variant
  Dim L_A As Integer
      If Len(AAAA) < 4 Then L_A = 0 Else: L_A = 1
  Buf = Array("Q1", L_A)
  hairetu_BBB = Buf
End Function

Function hairetu_CCC(BBBB As Variant)
  Dim Buf_B As Variant
  Buf_B = Array(BBBB(0), BBBB(1)) '←?どのように記述すれば良いですか?
  
  If Buf_B(0) = 0 Then hairetu_CCC = 0
  If Buf_B(1) = 1 Then hairetu_CCC = 1
 
End Function

【35645】Re:引数に配列を使った計算
発言  ichinose  - 06/3/8(水) 22:32 -

引用なし
パスワード
   ▼たけぞう さん:
こんばんは。


>たけぞうです。配列について教えてください。
>先ずは、私が理解しやすいようにモデルを簡単にしました。
>
>1.A1セルに文字列を入力します。
>2.B1セルに =hairetu_BBB(A1)を入力して、B1セルに
>   1行2列の配列を返します。
まず、↑セルB1だけに1行2列の配列を返すことはできません。
この場合は、

セルB1からC1を選択します。
選択した状態で数式バーに
「=hairetu_BBB(A1)」と指定します(両端の「」は除く)
セルの確定はEnterキーではなく、
Ctrl+Shift+Enterキーで確定します。

すると、セルB1には、"Q1"
セルC1には、0か1(セルA1の内容による)が表示されます。

つまり、hairetu_BBBで作成した配列要素は
セルB1とC1に表示されます。
これが配列です。

これを理解した上で
hairetu_CCCをどのようにするか
考えてみて下さい。

【35652】Re:引数に配列を使った計算
お礼  たけぞう  - 06/3/9(木) 8:45 -

引用なし
パスワード
   ▼ichinose さん:
説明ありがとうございます。根本部分がわかっていなかったみたいですね。

第1要素をセルの表示及び計算、第2要素に属性を与え他セルの判定用条件としたかったのですが、他の方法を考えます。

【35656】セルのColorIndexでVlookupを選択
質問  たけぞう  - 06/3/9(木) 11:37 -

引用なし
パスワード
   配列の考え方が間違っており1セルには複数のデータを保管できないことがわかりました。そこでデータではなくセルの色等を条件にすればと思い以下のマクロを作成しました。
A1に数値を入力、D4:F8をtable01と登録し、B1に =Test_VLook(A1)を入力しましたが、#VALUE!のエラーが出てしまいます。どのように修正すればよいのでしょうか。
実際には =Test_VLook()の入るセルは多数あります。また出来るだけ別シート等は作成したくないのでこのような方法を考えました。
回答宜しくお願いします。

Function Test_VLook(CELL_A1 As Variant)
  If CELL_A1.Interior.ColorIndex = 3 Then
    Test_VLook = Application.WorksheetFunction _
           .VLookup(CELL_A1, table01, 2)
  ElseIf CELL_A1.Interior.ColorIndex = 5 Then
    Test_VLook = Application.WorksheetFunction _
           .VLookup(CELL_A1, table01, 3)
  Else: Test_VLook = ""
  End If
End Function

【35669】Re:セルのColorIndexでVlookupを選択
発言  ichinose  - 06/3/9(木) 19:49 -

引用なし
パスワード
   ▼たけぞう さん:
こんばんは。

>配列の考え方が間違っており1セルには複数のデータを保管できないことがわかりました。そこでデータではなくセルの色等を条件にすればと思い以下のマクロを作成しました。
>A1に数値を入力、D4:F8をtable01と登録し、B1に =Test_VLook(A1)を入力しましたが、#VALUE!のエラーが出てしまいます。どのように修正すればよいのでしょうか。
セル範囲D4:F8を名前の登録でtable01という名前を付けたということですか?


>実際には =Test_VLook()の入るセルは多数あります。また出来るだけ別シート等は作成したくないのでこのような方法を考えました。
>回答宜しくお願いします。
>
Function Test_VLook(CELL_A1 As range) as variant

>  If CELL_A1.Interior.ColorIndex = 3 Then
    Test_VLook = Application.WorksheetFunction _
        .VLookup(CELL_A1, Names("table01").RefersToRange, 2,false)
>  ElseIf CELL_A1.Interior.ColorIndex = 5 Then
    Test_VLook = Application.WorksheetFunction _
        .VLookup(CELL_A1, Names("table01").RefersToRange, 3,false)
>  Else: Test_VLook = ""
>  End If
>End Function

でよいと思いますが・・・。

でも、セルを塗りつぶした色を変えても関数は反応しませんが
よいのですよね?

【35686】Re:セルのColorIndexでVlookupを選択
お礼  たけぞう  - 06/3/10(金) 11:04 -

引用なし
パスワード
   ▼ichinose さん:

回答ありがとうございます。頂いたリストで動きました。
登録したデータテーブルを呼び出すのに Names("table01").RefersToRangeとすれば良いのですね。当方ヘルプファイル自体の文法にまだ慣れていなく、皆さんの質問−回答を参考に作成しているので基本がなっていませんね。以後、努力していきます。

>でも、セルを塗りつぶした色を変えても関数は反応しませんが
>よいのですよね?
取込んでいるCELL_00の数値が変化し、それに伴い再計算されるので構いません。

参考にして正式Function作成しました。IF条件が不足していたのでANDで追加、検索型について、区分帯で検索しているので FalseからTrueに変えました。
下に示すそれで無事に計算が進められました。

Function R_SIZE_V(CELL_00 As Range, CELL_H As Range, _
            CELL_V As Range) As Variant
  Dim R_SIZE00 As Variant
  If (CELL_00.Interior.ColorIndex = 3 And CELL_00 <> CELL_H _
            And CELL_00 <> CELL_V) Then
    R_SIZE00 = Application.WorksheetFunction.VLookup(CELL_00, _
            Names("ユニット").RefersToRange, 7, True)
    R_SIZE_V = "(" + R_SIZE00 + ")"
  Else: R_SIZE_V = ""
  End If
End Function

>
>>配列の考え方が間違っており1セルには複数のデータを保管できないことがわかりました。そこでデータではなくセルの色等を条件にすればと思い以下のマクロを作成しました。
>>A1に数値を入力、D4:F8をtable01と登録し、B1に =Test_VLook(A1)を入力しましたが、#VALUE!のエラーが出てしまいます。どのように修正すればよいのでしょうか。
>セル範囲D4:F8を名前の登録でtable01という名前を付けたということですか?
>
>
>>実際には =Test_VLook()の入るセルは多数あります。また出来るだけ別シート等は作成したくないのでこのような方法を考えました。
>>回答宜しくお願いします。
>>
>Function Test_VLook(CELL_A1 As range) as variant
>
>>  If CELL_A1.Interior.ColorIndex = 3 Then
>    Test_VLook = Application.WorksheetFunction _
>        .VLookup(CELL_A1, Names("table01").RefersToRange, 2,false)
>>  ElseIf CELL_A1.Interior.ColorIndex = 5 Then
>    Test_VLook = Application.WorksheetFunction _
>        .VLookup(CELL_A1, Names("table01").RefersToRange, 3,false)
>>  Else: Test_VLook = ""
>>  End If
>>End Function
>
>でよいと思いますが・・・。
>
>でも、セルを塗りつぶした色を変えても関数は反応しませんが
>よいのですよね?

7988 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free