Excel操作について質問です。
1つ目のExcelファイルで検索文字列の存在する列と同じ列を指定して、
2つ目のExcelファイルから値を取得して処理をしたいのですが、
列の指定の部分で壁に当たってしまいました。
下記ソースのFor Eachの部分で
For Each xlsRange In wkbObj.Worksheets(1).Columns(keyColumn)
とすれば範囲指定は出来るのですが、
getStr = xlsRange.Value
で「型が一致しません。」のエラーが発生してしまいます。
For Each xlsRange In wkbObj.Worksheets(1).Range("A:A")
等と指定すればうまくいくのですが、これだと"A:A"という指定
自体の取得方法がわかりません。
列番号からRangeを指定する方法、もしくは、
"A:A" or "A"等の列名(?)の取得方法が分かる方がいましたら、
ご助言をお願い致します。
Dim wkbObj As Workbook ' Excel Workbook
Dim wkbObjKey As Workbook ' Excel Workbook
Dim wkSheetKey As Worksheet ' Excel WorkSheet
Dim xlsRange As Range ' Excelの指定範囲
Dim keyColumn As Long ' 列番号
Dim getStr As String ' ExcelのCellから取得した文字列
Set wkbObjKey = GetObject("ファイル1")
Set wkSheetKey = wkbObjKey.Worksheets(1)
' 2行目までをタイトルとみなしてその中にある
' 対象文字列の列番号を取得する
keyColumn = wkSheetKey.Range("1:2").Find("検索文字列").Column
Set wkbObj = GetObject("ファイル2")
' ↓ここで任意の1列を範囲指定してループしたい
For Each xlsRange In wkbObj.Worksheets(1).Range("ここでkeyColumnの列を指定したい")
getStr = xlsRange.Value
・
・
・
>getStr = xlsRange.Value
>で「型が一致しません。」のエラーが発生してしまいます。
Range に複数のセルが含まれる場合、Value は Variant 型の2次元配列
を返します。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200408/04080085.txt
>Range に複数のセルが含まれる場合、Value は Variant 型の2次元配列
>を返します。
確かにステップ実行で追いかけてみて2次元配列なのは確認していました。
しかし、これだとさらにループを回して取得した2次元配列の中身を
確認していく事になってしまいます。
for Each 〜
の部分でループを制御出来ることを期待しているのです。。。
ワガママで申し訳ありません。
…というか、本質は Columns で指定した Range を
For Each でまわしてもセル1つずつ取れてこないと
いう事ですね。Column が取れてるのかな???
… Cells を使って普通の For 文でまわせば?
[VBA]で確認しました。
Sub Test()
Dim xlsRange As Range
Dim aaa() As Variant
Dim xlsRange2 As Range
Set xlsRange = Worksheets("Sheet1").Columns(2)
Debug.Print xlsRange.Address '>$B:$B
Debug.Print xlsRange.Rows.Count '>65536
Debug.Print xlsRange.Columns.Count '>1
Debug.Print xlsRange.Cells(1, 1).Address '>$B$1
For Each xlsRange In Worksheets("Sheet1").Columns(2)
Debug.Print xlsRange.Address '>$B:$B
aaa = xlsRange.Value
Debug.Print UBound(aaa, 1) '>65536
Debug.Print UBound(aaa, 2) '>1
For Each xlsRange2 In xlsRange
Debug.Print xlsRange2.Address '>$B:$B
Next
Next
End Sub
>For Each xlsRange In wkbObj.Worksheets(1).Range("A:A")
>等と指定すればうまくいくのですが、これだと"A:A"という指定
>自体の取得方法がわかりません。
ちなみにボクは数字を引数に与えるとアルファベットが26進数として
返って来る関数を自作しましたね。Excel だと256までしか必要無い
けど、他のアプリでデフォルトのパラメータ名をかぶらずに出力
したい時とかに使ってました。Asc とか Chr とか使って再帰関数に
すればそう難しくないと思います。
Excel の関数であったりするのかな?…探した事ないなぁ。
ってゆーかオイラばか?
Set xlsRange = Worksheets("Sheet1").Columns(2)
For Each xlsRange In Worksheets("Sheet1").Range(xlsRange.Address)
Debug.Print xlsRange.Address
Next
でええやん(TT)
>…というか、本質は Columns で指定した Range を
>For Each でまわしてもセル1つずつ取れてこないと
>いう事ですね。
そうなんです(T_T)
セルが取れると思ったのですが。。。
>ちなみにボクは数字を引数に与えるとアルファベットが26進数として
>返って来る関数を自作しましたね。
なるほど、自分で関数作っちゃえば良いんですね。
Excel操作してる時はExcelの関数だけで何とかしなきゃいけないと
思い込んでました…やってみます!
>Set xlsRange = Worksheets("Sheet1").Columns(2)
>For Each xlsRange In Worksheets("Sheet1").Range(xlsRange.Address)
ちなみにこれだとxlsRange.Valueの値は2次元配列でした。。。
特攻隊長まるるうさんありがとうございましたm(_ _)m
>>Set xlsRange = Worksheets("Sheet1").Columns(2)
>>For Each xlsRange In Worksheets("Sheet1").Range(xlsRange.Address)
>ちなみにこれだとxlsRange.Valueの値は2次元配列でした。。。
↑ウソつきました。自分のやり方が間違ってました。
この方法でうまく行きました!
特攻隊長まるるうさん大感謝ですm(_ _)m
ツイート | ![]() |