Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Access 2016)
UBound関数でエラー
投稿日時: 22/01/14 13:07:43
投稿者: hareru

Excelシートを配列へ格納しようとしていますが、UBound関数で「型が一致していません」が返されます。
Dim xls As Object
Dim wkb As Object
Dim wks As Worksheet
Dim vrWs As Variant
Dim lIx1 As Long, lIx2 As Long
 
'Excelでの処理
Set xls = CreateObject("Excel.application")
Set wkb = xls.Workbooks.Open(sFullPath)
 
With wkb
    'Excelは不可視
    .Application.Visible = False
    .Activate
End With
     
'ワークシートのSheet1を開く
Set vrWs = wkb.Worksheets(1).UsedRange
Debug.Print vrWs(1, 1)
 
Dim lRow As Long, lCol As Long
lRow = UBound(vrWs, 1) ←ここでエラー
lCol = LBound(vrWs, 1)
 
    For lIx1 = 1 To lRow
        For lIx2 = 1 To lCol
     
            Debug.Print vrWs(lIx1, lIx2)
        Next lIx2
    Next lIx1
たぶん、基本的なことでは無いかと思うのですが、EXCELのbookやsheetのコントロールが良く分かっていません。
どなたかアドバイスをお願いいたします。

回答
投稿日時: 22/01/14 18:30:03
投稿者: sk

引用:
Excelシートを配列へ格納しようとしていますが、UBound関数で「型が一致していません」が返されます。

配列ではなく Excel.Range オブジェクトそのものを渡しているからです。
 
引用:
Set vrWs = wkb.Worksheets(1).UsedRange

Set vrWs = wkb.Worksheets(1).UsedRange.Value

投稿日時: 22/01/17 08:00:26
投稿者: hareru

skさん、回答ありがとうございます。
 
会社での作業の為、返信が遅くなりすみません。
 
>Set vrWs = wkb.Worksheets(1).UsedRange.Value
 
で、実行すると上記で「型が一致しません」のエラーが出てしまいます。
 
もしかして私からの情報提示が不足しているのでしょうか?
 
引き続き、よろしくお願いいたします。

回答
投稿日時: 22/01/17 09:28:49
投稿者: Suzu

Set ではなく、Let へ変えてください。

引用:
Set vrWs = wkb.Worksheets(1).UsedRange.Value

 ↓
Let vrWs = wkb.Worksheets(1).UsedRange.Value
 
 
 
引用:
lRow = UBound(vrWs, 1) ←ここでエラー

との事ですが、
直前の
Debug.Print vrWs(1, 1)
にて、イミディエイトウィンドウに値は出力されていますか?
ローカルウィンド にて vrWs が Empty でない事を確認ください。

投稿日時: 22/01/17 11:28:32
投稿者: hareru

Suzuさん、回答ありがとうございます。
 
Set → Let で、解決いたしました。
 
Excel vbaではSetを使っていたのですが、AccessではExcelワークシート変数からVariant文字列変数に代入するには「Let」を使用しなければならない、という事でしょうか?
 
よろしくお願いいたします。

回答
投稿日時: 22/01/17 13:09:37
投稿者: Suzu

hareru さんの引用:
Excel vbaではSetを使っていたのですが、AccessではExcelワークシート変数からVariant文字列変数に代入するには「Let」を使用しなければならない、という事でしょうか?

 
言語としては同じVBAですから
Excelだから Set 、Accessだから Let と言うことはではありません。
 
 
Set ステートメント
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/set-statement
オブジェクト参照を変数またはプロパティに割り当てます。
 
Let ステートメント
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/let-statement
式の値を変数またはプロパティに代入します。
 
オブジェクトの参照を行う場合には、Set 値の代入には Let です。
配列変数 は オブジェクトではなく、値 になりますので、 Let です。
 
Excel VBA の時のコードをもう一度確認ください。

投稿日時: 22/01/17 14:23:43
投稿者: hareru

Suzuさん
 
ご親切にありがとうございました。
大変、助かりました。
 
 
以上、よろしくお願いいたします。