配列にすると変数が入らない

このQ&Aのポイント
  • MS Excel2003のVBAで配列にすると、オブジェクト型配列には変数が入らない現象が起きます。
  • find関数の結果をオブジェクト型変数に代入することはできますが、配列にするとエラーが発生します。
  • 具体的なエラーメッセージは実行時エラー1004で、「アプリケーション定義またはオブジェクト定義のエラーです」と表示されます。
回答を見る
  • ベストアンサー

配列にすると変数が入らない

お世話になっています MS Excel2003のVBAで質問です find関数の結果を オブジェクト型変数だと入るのに、オブジェクト型配列だと入らない、 そういう仕様なんでしょうか? 成功 Dim result As Object Set result = wb2.Worksheets(1).Range(Cells(2, num), Cells(500, num)).Find(key) 実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです Dim result(10) As Object '検索結果 Set result(0) = wb.Worksheets(1).Range(Cells(i, num), Cells(500, num)).Find(key)

  • royee
  • お礼率21% (5/23)

質問者が選んだベストアンサー

  • ベストアンサー
  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.3

よくあるオブジェクト省略の罠です。 Rangeプロパティの引数にCellsプロパティを使う場合,Rangeオブジェクトの 親オブジェクトがCellsオブジェクトの親オブジェクトになると錯覚しますが, 個別に記述しなければ駄目なんです。 エラーにならなかったケースは、たまたまCellsのオブジェクトがRangeと合致 したからだと思います。 一例です。 With wb.Worksheets(1)  Set result(0) = .Range(.Cells(i, num), .Cells(500, num)).Find(key) End With

royee
質問者

お礼

普段使わないのでよくわかっていませんでした。どうもありがとうございました!!

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

>Range(Cells(i, num), Cells(500, num)).Find(key) のCells()2つの前にWorksheets("Sheet1")。のようなシートを特定するコードを入れてみたら解決するかも。 よく経験するので。   オブジェクトを配列に入れて後どうするのか。 Findはセルの値で検索するが、普通はその行の他列の情報を見たくて、その行番号などが知りたい場合が多い。 配列になぜ貯める?

royee
質問者

お礼

別にためた配列を別ファイルに吐き出すからです!ありがとうございます。シート特定してみました。

  • utun01
  • ベストアンサー率40% (110/270)
回答No.2

そういうのは大体Variantで返ってきます。 配列であればCollectionに入れてみてはどうでしょうか? ちなみに、VBAは固定配列が非常に使いづらいので、 Collectionを使用してWrapperクラスを作って運用するとやりやすいですよ。 (個人的には、ですがw)

  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.1

Object配列がエラーではなく wb.Worksheets(1).Range(Cells(i, num), Cells(500, num)).Find(key) のエラーでは。 たとえば"i"に値が入ってないとか。

関連するQ&A

  • 'Range'メソッドは失敗しました

    ExcelのVBAの質問になりますが、教えてください。 下記を動かすと最後の行で「'Range'メソッドは失敗しました: '_Worksheet' オブジェクト」と出ます どうしても最後の行をセレクトしたいのですが、どうしたらよいでしょうか。 Option Explicit Public WB1 As Workbook Public WB1SH1 As Worksheet Public CSVWB1 As Workbook Public CSVWB1SH1 As Worksheet Dim MaxRow As Integer Private Sub CommandButton1_Click() Set WB1 = ActiveWorkbook Set WB1SH1 = WB1.Worksheets(1) Dim a As String a = WB1SH1.Range("a1) Workbooks.Open "C:\Users\User\Desktop\" & a & ".CSV" Set CSVWB1 = ActiveWorkbook Set CSVWB1SH1 = CSVWB1.Worksheets(1) MaxRow = CSVWB1SH1.Cells(Rows.Count, 1).End(xlUp).Row WB1SH1.Activate WB1SH1.Range(Cells(1, 1), Cells(MaxRow, 3)).Select CSVWB1SH1.Activate CSVWB1SH1.Range(Cells(1, 1), Cells(MaxRow, 3)).Select  '←ここでエラーがでる End Sub

  • 日付型変数を検索する方法

    シート内にある日付型の変数を検索させる処理をしたいのですが、以下のように記述したところ、 ================================== Dim hiduke As Date Dim lngYLine As Long Dim intXLine As Integer hiduke = Cells(1, 3).Value 'セルの値取得 Set Obj = Worksheets("Sheet1").Cells.Find(hiduke) If Obj Is Nothing Then MsgBox "該当の日付" & hiduke & "は、ありません。" Else lngYLine = Worksheets(newSh).Cells.Find(hiduke).Row intXLine = Worksheets(newSh).Cells.Find(hiduke).Column     MsgBox hiduke"は、" + CStr(lngYLine) + "行目の" _ + CStr(intXLine) + "列目にあります" End If ================================== Set Obj = Worksheets("Sheet1").Cells.Find(hiduke) で「実行時エラー"9" インデックスが有効範囲にありません」のエラーになります。 ワークブック内には Worksheets("Sheet1")存在しますし、なぜこのようなエラーがでるのか? また、どうしたら解消できるのか?について、教えていただきたく・・・ よろしくお願いいたします。

  • VBA 実行時エラーで、"プロパティまたはメソッド

    ・Sheet1(コード) Private Sub CommandButton1_Click() Call aaa End Sub ・Module1(コード) Sub aaa() Dim wb As Workbook Dim ws As Worksheet Workbooks.Open ("c:\test.xls") Set wb = Workbooks("test.xls") Set ws = wb.Worksheets("Sheet1") wb.ws.Range("A2").Value = "CCC" End Sub wb.ws.Range("A2").Value = "CCC"の部分で 以下の実行エラーが出ます。 ------------------------------------------------------------------------ 実行時エラー'438': オブジェクトは、このプロパティまたはメソッドをサポートしていません。 ------------------------------------------------------------------------ Set wb = Workbooks("test.xls") Set ws = wb.Worksheets("Sheet1") の部分で特にエラーも出ないので、オブジェクトの取得は成功していると 思うのですが、WorkSheetオブジェクトのwsからRangeメソッドを呼ぶことが できません。 動かない原因と対策を教えてください!!

  • VBA 変数について

    VBA初心者でございます。 VBAでgrpという変数を設定し、それをキーにしてオートフィルタをしたいです。 以下のコードではエラーがでてしまうのは、なぜでしょうか? どうぞ宜しくお願いいたします。 Sub 絞り込み2() Dim grp Set grp = Worksheets("リスト").Cells(3, 2) Worksheets("マスタ0701").AutoFilterMode = False With Worksheets("マスタ0701").Range(Cells(3, "B"), Cells(Rows.Count, "CK").End(xlUp)) .AutoFilter Field:=13, Criteria1:=grp '.CurrentRegion.Select Range(Cells(3, "B"), Cells(Rows.Count, "CK").End(xlUp)).SpecialCells(xlVisible).Copy Worksheets("検索結果").Range("A1") '.AutoFilter End With End Sub

  • EXCEL2010エラーVBA

    下記を実行するとエラーになりEXCEL2010が終了してしまいます。 fDebug:0 offset00009391 がエラーメッセージです。 何が原因でしょうか。 Private Sub Worksheet_Change(ByVal Target As Range) Dim ws As Worksheet Dim rg As Range Dim r As Variant Dim c As Long Dim hanni1 As Range Dim atai As Range Set ws = Worksheets("あああ") Set rg = Worksheets("コード").Range("A1:B10") r = ws.Cells(Rows.Count, 1).End(xlUp).Row Set hanni1 = ws.Range(Cells(2, 2), Cells(r, 3)) Set atai = ws.Range(Cells(2, 3), Cells(r, 3)) atai = Application.VLookup(hanni1, rg, 2, False) End Sub

  • エクセルVBA,シート間転記でエラー1004

    皆様宜しくお願いします。 以下の記述で 「実行時エラー1004アプリケーション定義 またはオブジェクト定義のエラーです」が 出てきます。 やりたい作業としては「週入力」シートの D5セルから下に入力されている内容を 「転記」シートの同じセル範囲へ転記したいです。 現在、転記先開始位置としてD5セルを決め打ちしています。 D行は固定ですが 列は変更になる可能性があるので ゆくゆく変数で書きたいと思っています。 以前はfor next で1行ずつ転記していてたのですが データが多すぎて時間がかかるので すこしでも時間短縮できればと 思いコードをあれこれ考えています。 どうかよろしくお願いします。 Sheets("週入力").Select Dim aa As Long      'A行の最終取得 aa = Range("A" & Rows.Count).End(xlUp).Row Dim 人数 As Long     '変数「人数」を定義 人数 = aa - 4 Dim wsデータ As Worksheet Dim ws結果 As Worksheet Set wsデータ = ActiveWorkbook.Worksheets("週入力") Set ws結果 = ActiveWorkbook.Worksheets("転記") ws結果..Range(Cells(5, "D"), Cells(人数 + 5 - 1, "D")) =ws結果.Range(Cells(5, "D"), Cells(人数 + 5 - 1, "D")).Value

  • マクロ FIND 検索方向の変更

    いつも回答ありがとうございます。 FINDを使用した検索方向の変更についての質問です。以下のFINDの記述方法で、上から一発目に捉えられたキーワードではなく、下から一発目に捉えられたキーワードに変更するにはどうしたらよろしいでしょうか?それとも、FINDの記述方法を大幅に変えなければいけないのでしょうか?御指導の程宜しくお願い致します。 Sub TEST() Dim d As Integer Dim e As Integer Worksheets("一覧").Activate d = 3 e = 3 Do While Worksheets("一覧").Cells(d, 2).Value <> "" Dim c As Variant Dim R As Range Dim s As Range With Worksheets(Worksheets("一覧").Cells(d, 2).Value) Set c = .Columns("H").Find("増", , xlValues, 1) If Not c Is Nothing Then Set R = .Range(c.Offset(1, -4), .Cells(Rows.Count, "D").End(xlUp)) Set s = c.Offset(, -5) With Worksheets("編集用一覧") .Range(.Cells(e, 4), .Cells(e, 5)).ClearContents .Cells(e, 4).Value = s .Cells(e, 5).Value = Application.Sum(R) End With End If End With d = d + 1 e = e + 4 Loop End Sub

  • エクセルVBAのオートフィルタについて

    いつもお世話になります。 エクセル2007でVBAでオートフィルタを操作したいのですが、 一部うまくいきません。 以下の様なコードを書いて 日付で絞り込みたいのですが、 何も抽出されません。 リストを見てみると、変数はちゃんと入っており OK ボタンを押すとその日付で抽出されます。 何故VBAでの操作では抽出されないのでしょうか。 ご存じの方がおられましたら、よろしくお願いします。 Sub test() Dim mydate As Variant Dim rng3 As Range Dim fmt As Variant Dim objList3 As ListObject Dim wb1 As Workbook Dim wb2 As Workbook Dim wb4 As Workbook Dim sh1 As Worksheet Dim sh2 As Worksheet Dim sh3 As Worksheet Dim sh4 As Worksheet Dim sh7 As Worksheet '----------------------------------------------------------------------- Set wb1 = Workbooks("301.xlsm") Set wb2 = Workbooks("1.xls") Set wb4 = Workbooks("2.xls") Set sh1 = wb1.Worksheets("@") Set sh2 = wb1.Worksheets("@@") Set sh3 = wb2.Worksheets("@@@") Set sh4 = wb2.Worksheets("@@@@") Set sh7 = wb4.Worksheets("@@@@@") '---------------------------------------------------------- sh2.Range("A1:z63").ClearContents With sh7 Set objList3 = .ListObjects("リスト1") fmt = .Range("A2").NumberFormatLocal mydate = Format(mydate, fmt) objList3.Range.AutoFilter Field:=7, Criteria1:=mydate objList3.Range.AutoFilter Field:=5, Criteria1:="test" Set rng3 = objList3.Range.SpecialCells(xlCellTypeVisible) rng3.Copy sh2.Range("A2") objList3.Range.AutoFilter Field:=5 objList3.Range.AutoFilter Field:=5, Criteria1:=">=190" Set rng3 = objList3.Range.SpecialCells(xlCellTypeVisible) rng3.Copy sh2.Range("A20") objList3.Range.AutoFilter Field:=5 objList3.Range.AutoFilter Field:=7 End With Application.CutCopyMode = False Set rng3 = Nothing Set fmt = Nothing Set objList3 = Nothing Set wb1 = Nothing Set wb2 = Nothing Set wb4 = Nothing Set sh1 = Nothing Set sh2 = Nothing Set sh3 = Nothing Set sh4 = Nothing Set sh7 = Nothing End Sub (一部省略しています)

  • VBA 複数のシートをまたいでの連想配列

    win7、Excelは2013を使用しています。 添付画像の様に、12シートの合計を連想配列に格納しsheet13に書き出したいのですが、プロシージャーの下から6行目のところで、エラーコード451が出ます。 どの様に変更すれば良いか教えて下さい。 Sub 年間集計() Dim Dic Dim i As Integer Dim j As Integer Dim sh As Worksheet Dim rng As Range Dim buf As String Dim num As Integer Set Dic = CreateObject("Scripting.Dictionary") For Each sh In Worksheets For Each rng In sh.Range("J2", sh.Cells(Rows.Count, 10).End(xlUp)) buf = rng.Value num = rng.Offset(, 1).Value If Not Dic.Exists(buf) Then Dic.Add buf, num Else Dic.Item(buf) = Dic.Item(buf) + num End If Next rng Next sh j = 2 With Worksheets("Sheet13") For i = 0 To Dic.Count - 1 .Cells(j, 1) = Dic.Keys(i)   ’エラー箇所 .Cells(j, 2) = Dic.Items(i) j = j + 1 Next i End With End Sub

  • excelからAccessのDBを更新でエラー

    excel2016 excelでaccessへのデータ登録はできたのですが、登録したaccessデータの更新でエラーが発生します。 構成 MENUシートのD4に表示されたシート名でaccessへ登録を実施。 このシート名はaccessのテーブル名になっている。 accesssのファイル名は Machine.accdbでサーバに登録している(サーバ名の実名は伏せて***にしてます) accessファイルは単独で編集できない様にパスワード付きでexcelからのみ追加更新を可能にする。 excelの題目 A1:ref_serial C1:result1 D1:result2 他にも題目ありますが、関係する部分とします。 データは A2セルに数字4桁 C2セル整数2桁小数点3桁 D2セル整数2桁小数点3桁 accessで ref_serial、オートナンバー、長整数型 result1,数値型、単精度浮動小数点型 result2,数値型、単精度浮動小数点型 としてます addのマクロで追加した内容を、そのままrenewのマクロ実行すると 実行時エラー424 オブジェクトが必要です とのポップアップエラーが発生します。 エラーが発生するのは strSQL = _ "UPDATE '" & sheet_name & "' " & _ "SET " & _ ws.Worksheets(sheet_name).Range("C1").Value & "=" & ws.Worksheets(sheet_name).Range("C2").Value & "," & _ ws.Worksheets(sheet_name).Range("D1").Value & "=" & ws.RWorksheets(sheet_name).ange("D2").Value & "," & _ "WHERE ref_serial =" & ws.Worksheets(sheet_name).Range("A2").Value の部分。 web等でも調べたのですが、何が悪いのかわからず、このエラーが出ない様に修正いただきたく、よろしくお願いします。 データ登録のマクロ Sub add() Dim strFileName As String strFileName = "Machine.accdb" Dim DBpath As String DBpath = "***" 'accdbファイルパス Dim password As String password = "AAAA" 'InputBox("パスワードを入力してください") If password = "" Then Exit Sub Dim adoCn As Object 'ADOコネクションオブジェクト Set adoCn = CreateObject("ADODB.Connection") 'ADOコネクションオブジェクトを作成 adoCn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & DBpath & "\" & strFileName & ";" & _ "Jet OLEDB:Database Password=" & password & ";" 'Accessファイルに接続 Dim adoRS As Object 'ADOレコードセットオブジェクト Set adoRS = CreateObject("ADODB.Recordset") 'ADOレコードセットオブジェクトを作成 Dim day As String day = Worksheets("MENU").Cells(1, 2) Dim sheet_name As String sheet_name = Worksheets("MENU").Cells(4, 4) With adoRS .Open sheet_name, adoCn, adOpenKeyset, adLockOptimistic 'レコードセットを開く" Dim adoCON As New ADODB.Connection .AddNew !ref_serial = Worksheets(sheet_name).Cells(2, 1) !result1 = Worksheets(sheet_name).Cells(2, 3) !result2 = Worksheets(sheet_name).Cells(2, 4) !result_update = Worksheets("MENU").Cells(1, 2) .update .Close 'レコードセットのクローズ End With adoCn.Close 'コネクションのクローズ Set writeSht = Nothing Set adoRS = Nothing Set adoCON = Nothing End Sub 更新のマクロ Sub renew() Dim strFileName As String strFileName = "Machine.accdb" Dim DBpath As String DBpath = "***" 'accdbファイルパス Dim password As String password = "AAAA" 'InputBox("パスワードを入力してください") If password = "" Then Exit Sub Dim adoCn As Object 'ADOコネクションオブジェクト Set adoCn = CreateObject("ADODB.Connection") 'ADOコネクションオブジェクトを作成 adoCn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & DBpath & "\" & strFileName & ";" & _ "Jet OLEDB:Database Password=" & password & ";" 'Accessファイルに接続 Dim day As String day = Worksheets("MENU").Cells(1, 2) Dim sheet_name As String sheet_name = Worksheets("MENU").Cells(4, 4) Dim strSQL As String strSQL = _ "UPDATE '" & sheet_name & "' " & _ "SET " & _ ws.Worksheets(sheet_name).Range("C1").Value & "=" & ws.Worksheets(sheet_name).Range("C2").Value & "," & _ ws.Worksheets(sheet_name).Range("D1").Value & "=" & ws.RWorksheets(sheet_name).ange("D2").Value & "," & _ "WHERE ref_serial =" & ws.Worksheets(sheet_name).Range("A2").Value adoCn.Execute strSQL 'SQLを実行 adoCn.Close 'コネクションのクローズ Set adoCn = Nothing 'オブジェクトの破棄 End Sub

専門家に質問してみよう