Excelで1つの列を範囲指定するには?

解決


おうれい  2005-09-09 23:04:55  No: 125105

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
        ・
        ・
        ・


特攻隊長まるるう  2005-09-10 00:15:56  No: 125106

>getStr = xlsRange.Value
>で「型が一致しません。」のエラーが発生してしまいます。
Range に複数のセルが含まれる場合、Value は Variant 型の2次元配列
を返します。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200408/04080085.txt


おうれい  2005-09-10 00:54:52  No: 125107

>Range に複数のセルが含まれる場合、Value は Variant 型の2次元配列
>を返します。
確かにステップ実行で追いかけてみて2次元配列なのは確認していました。
しかし、これだとさらにループを回して取得した2次元配列の中身を
確認していく事になってしまいます。
for Each 〜
の部分でループを制御出来ることを期待しているのです。。。
ワガママで申し訳ありません。


特攻隊長まるるう  2005-09-10 00:55:46  No: 125108

…というか、本質は 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


特攻隊長まるるう  2005-09-10 01:18:13  No: 125109

>For Each xlsRange In wkbObj.Worksheets(1).Range("A:A")
>等と指定すればうまくいくのですが、これだと"A:A"という指定
>自体の取得方法がわかりません。
ちなみにボクは数字を引数に与えるとアルファベットが26進数として
返って来る関数を自作しましたね。Excel だと256までしか必要無い
けど、他のアプリでデフォルトのパラメータ名をかぶらずに出力
したい時とかに使ってました。Asc とか Chr とか使って再帰関数に
すればそう難しくないと思います。
Excel の関数であったりするのかな?…探した事ないなぁ。


特攻隊長まるるう  2005-09-10 01:32:19  No: 125110

ってゆーかオイラばか?
    Set xlsRange = Worksheets("Sheet1").Columns(2)
    For Each xlsRange In Worksheets("Sheet1").Range(xlsRange.Address)
        Debug.Print xlsRange.Address
    Next
でええやん(TT)


おうれい  2005-09-10 01:52:38  No: 125111

>…というか、本質は 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


おうれい  2005-09-10 02:03:42  No: 125112

>>Set xlsRange = Worksheets("Sheet1").Columns(2)
>>For Each xlsRange In Worksheets("Sheet1").Range(xlsRange.Address)
>ちなみにこれだとxlsRange.Valueの値は2次元配列でした。。。
↑ウソつきました。自分のやり方が間違ってました。
この方法でうまく行きました!

特攻隊長まるるうさん大感謝ですm(_ _)m


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加