• 締切済み

マクロに関するエラー(オブジェクトが必要です。)

マクロは始めてで、いろいろ調べながら作ってみたのですが、 Set検索値の行でオブジェクトが必要ですというエラーが出て、 先に進めなくなりました。 申し訳ないのですが、何方かエラーの対処法を教えていただけないでしょうか。 よろしくお願いします。 ========================== Sub test() Worksheets("2月分").Activate Dim 検索値 As Integer Set 検索値 = Worksheets("2月分").Cells(4, 18) Worksheets("テスト").Activate Dim B As Range Dim C As Range For Each B In Range("B13,B413") ' 第一条件 If B.Value >= 検索値 Then GoTo Continue End If ' 第二条件 If B.Offset(0, 1).Value < 検索値 Then ' Offset(0, 1) は B列の隣のC列の値を取得 GoTo Continue End If Dim aValue As String aValue = B.Offset(0, 2).Value Worksheets("2月分").Cells("D19").Value = aValue Continue: Next End Sub

みんなの回答

  • hue2011
  • ベストアンサー率38% (2800/7250)
回答No.4

No.1さんの言っていることが正しいです。 もっと説明しましょう。 Setというのは左辺がオブジェクトでなければ実行できません。 にもかかわらず、DimでIntegerだと宣言しているのです。 Integerというのは型であってオブジェクトではありません。 Cellsと書いて、データだけとオブジェクトを混乱してみているから問題なのです。 その差はどこにあるか。 Cell自体はいろいろな性質を持っていますね。表示属性だとか。計算式が入っていることもある。 でも、見るときは数字だったり文字列だったりがのっているように見えます。 お皿にペーパーが敷いてあってそこにホットケーキが乗っている、前にナイフとフォークがある。 これがお盆に乗っているのがサンプルとして表示されているカフェがあったとします。 注文するとき、「ホットケーキをくれ」といったら、普通はこのお盆にのっけた状態でくれという意味ですね。 それがオブジェクトという考えです。 ナイフも皿もいらない、ホットケーキだけ食いたい手づかみで、という希望もありえて、手にわたしてくれというかもしれない。 そのとき、手、は、ここに菓子を乗せろ、という宣言をしているのと同じです。 Dim Integerとしたら、手にのせてくれといって丸いかたちに手のひらを差し出したことになります。 Setといったらお盆ごともってこいといったのです。 てのひらにそんなでかいものは乗りませんから、ウェイターに注意されたのです。 そういうことです。

1857fumi
質問者

お礼

わかりやすく噛み砕いていただき、ありがとうございます! VBA初心者でデータとかオブジェクトとかよくわかっていなくて混乱してるのですが、説明がわかりやすかったのでベストアンサーに選ばせていただきました。ありがとうございます!

  • chie65535
  • ベストアンサー率43% (8514/19356)
回答No.3

「Set」を「Let」に変えましょう。 ・Set文 Set オブジェクト名 = オブジェクト参照 ・Let文 Let 変数名 = 式 なお「Let文」の「Let」は省略が可能です。 詳しくは http://www.gizcollabo.jp/vbtomo/log/archive/vbqanda_39285_0.html を参照。

1857fumi
質問者

お礼

Let文について調べてみますね!ありがとうございます!

  • teppou
  • ベストアンサー率46% (356/766)
回答No.2

 本業ではありませんが、数年前まで業務で VBA を組んでいました。  もっといい回答が出るかもしれませんが、回答してみます。  「オブジェクトが必要です」というエラーに悩まされました。  はっきりした原因はついにわかりませんでしたが、次のように対処しました。  Worksheets("2月分")Activate の行は問題ないのだと思います。  Set 検索値 = Worksheets("2月分").Cells(4,18) の行がエラーになるという事ですね。  その行を  Sheet3.Cells(4,18) のように Sheetの番号で指定してみてください。

1857fumi
質問者

お礼

ありがとうございます!「オブジェクトが必要です」というエラーに私も悩まされています( ;∀;)

回答No.1

Set 検索値 = Worksheets("2月分").Cells(4, 18) ↓ 検索値 = Worksheets("2月分").Cells(4, 18) ========== Setは変数にオブジェクトを格納する時に使用するものです。 オブジェクトを格納する所に、オブジェクトが無いので、「オブジェクトが必要です」というエラーが出ています。

1857fumi
質問者

お礼

エラーが消えました(*'▽')ありがとうございました!

関連するQ&A

  • マクロ 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

  • マクロ 記述が悪くエラーがかかります。

    いつも回答ありがとうございます。 最後らへんの記述で実行時エラー【型が一致しません】がかかります。 Worksheets("集計用").Range(b1, b2).Copy _ Destination:=Worksheets(b3).Range("B2") ← ここでエラーがかかる。 ワークシート名に変数を使用しているせいだと思います。 解決する方法を御指導して頂けないでしょうか?宜しくお願い致します。 Sub グラフの作成() Dim Date1 As Date Dim Date2 As Date Dim SName As String Dim b1 As Variant Dim b2 As Variant Dim b3 As Variant Dim d1 As Variant Dim d2 As Variant Dim d3 As Variant With Worksheets("集計用") s1: Date1 = Application.InputBox("最初の日付を2012/12/1のように入力してください。") If Date1 = 0 Then MsgBox "キャンセルされました。", vbOKOnly Exit Sub End If Set b1 = .Columns("B").Find(Date1, , xlValues, 1) If b1 Is Nothing Then If MsgBox("入力した日付が見当たりません。" & vbNewLine & _ "再度入力しますか?", vbYesNo) = vbYes Then GoTo s1 Else MsgBox "処理を中止しました", vbOKOnly Exit Sub End If End If d1 = b1.Row s2: Date2 = Application.InputBox("最初の日付を2012/12/31のように入力してください。") If Date1 = 0 Then MsgBox "キャンセルされました。", vbOKOnly Exit Sub End If Set b2 = .Columns("B").Find(Date2, , xlValues, 1) If b2 Is Nothing Then If MsgBox("入力した日付が見当たりません。" & vbNewLine & _ "再度入力しますか?", vbYesNo) = vbYes Then GoTo s2 Else MsgBox "処理を中止しました", vbOKOnly Exit Sub End If End If d2 = b2.Row s3: SName = Application.InputBox("商品名を入力して下さい。") If SName = "False" Then MsgBox "キャンセルされました。", vbOKOnly Exit Sub End If Set b3 = .Rows("3").Find(SName, , xlValues, 1) If b3 Is Nothing Then If MsgBox("入力した商品名が見当たりません。" & vbNewLine & _ "再度入力しますか?", vbYesNo) = vbYes Then GoTo s3 Else MsgBox "処理を中止しました", vbOKOnly Exit Sub End If End If d3 = b3.Column End With Worksheets.Add After:=Worksheets("集計用") ActiveSheet.Name = b3 Worksheets("集計用").Range(b1, b2).Copy _ Destination:=Worksheets(b3).Range("B2") Worksheets("集計用").Range(Cells(d1, d3), Cells(d2, d3)).Copy _ Destination:=Worksheets(b3).Range("C2") End Sub

  • エクセルの簡単なマクロ機能を追加したいのです

    既存のエクセルマクロ(Sub チェック()以下です)に下記の内容のマクロを付け足したいです。 教えていただけないでしょうか。 付け足したい条件です:  Sheet2のC列に 0  があれば  Sheet1のB列に 愛 と([太字]でセルの背景色を[灰色25%]にして)入れたいです 恐れ入りますがご存じの方がいらっしゃりましたら教えていただきたく何卒よろしくお願いいたします。 ----------------------------------------------- Sub チェック() Dim Ws1 As Worksheet Dim Ws2 As Worksheet Dim myRange1 As Range Dim myRange2 As Range Dim c1 As Range Dim c2 As Range Dim myCt As Long Set Ws1 = Worksheets("Sheet1") Set Ws2 = Worksheets("Sheet2") Set myRange1 = Ws1.Range("A1", Ws1.Cells(Rows.Count, "A").End(xlUp)) Set myRange2 = Ws2.Range("A1", Ws2.Cells(Rows.Count, "A").End(xlUp)) For Each c1 In myRange1 myCt = 0 For Each c2 In myRange2 If c2.Value = c1.Value Then If c2.Offset(, 1).Value = "" Then c1.Offset(, 1).Interior.ColorIndex = 3 Else c1.Offset(, 1).Value = c2.Offset(, 1).Value End If myCt = myCt + 1 End If Next c2 If myCt > 1 Then c1.Offset(, 1).Interior.ColorIndex = 10 Next c1 Set Ws1 = Nothing Set Ws2 = Nothing Set myRange1 = Nothing Set myRange2 = Nothing End Sub

  • Excel  VBAのマクロについて

    以下のようなマクロを作りました。 P4に開始番号P6に終わりの番号があるのですが、P4=P6、つまり、一つだけのシートを作成する分には問題なく動きます。しかしP4に1、P6に5と範囲を増やすとエラーが出て動きません。どこをなおしたらよろしいでしょうか? Option Explicit Sub 一括() Dim I As Worksheet Dim SheetName As String Dim Prompt As String Dim Col As Integer Dim Cell As Range Dim Row As Long Dim hani As Long For hani = Range("P4").Value To Range("P6").Value Set I = ActiveSheet SheetName = Cells(hani + 4, "K").Value & "(" & Cells(hani + 4, "B") & ")" Prompt = SheetName & "が存在します。" Sheets("基本シート").Copy After:=Sheets("基本シート") On Error GoTo 100 ActiveSheet.Name = SheetName On Error GoTo 0 Range("X3") = I.Cells(hani + 4, "B") Range("E8") = I.Cells(hani + 4, "C") Range("A13") = I.Cells(hani + 4, "D") For Col = 0 To 8 Step 4 Set Cell = I.Cells(hani + 4, "D").Offset(, Col) If Cell > 0 Then Prompt = "該当する日付がありません。" & Cell.Address On Error GoTo 100 Row = WorksheetFunction.Match(Cell, [A:A], 0) On Error GoTo 0 Cells(Row, "E") = I.Cells(hani + 4, "E").Offset(, Col) Cells(Row, "H") = I.Cells(hani + 4, "F").Offset(, Col) If Col < 8 Then Cells(Row, "Y") = I.Cells(hani + 4, "G").Offset(, Col) End If End If Next Col Next hani End 100 If Err <> 1004 Then Error Err End End If MsgBox Prompt, vbCritical Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True Sheets(1).Select End Sub

  • Excel マクロのFor~Nextで再起動エラー

    勤務表を作っています。 下記の’OKまでは希望どうりうまく出来ていたのですが、勤務表の下セルに各列の人員(行)10名分位A,B,Cの計を表示させたい。実行するとエラー「Microsoft office Excel 再起動」を求められます。  for~が判断指令が<重い>のでしょうか。なんとか回避さする方法を教えてください。 Win XP Sp2 Office Excel 2007です。今回これを作るにあたり初VBA使用者です。 ' C入力後の翌日は休をセット。CC連続は休休セット。 Private Sub Worksheet_Change(ByVal Target As Range) Dim cnt As Variant Dim a1 As Byte Dim b1 As Byte Dim c1 As Byte Dim nin As Variant Dim retsu As Variant If Target.Count > 1 Then Exit Sub '複数セルの入力は無視 'A If Target.Value = "A" Or Target.Value = "A" Then Target.Value = "A" Range("AV16").Value = Target.Column End If 'B If Target.Value = "B" Or Target.Value = "B" Then Target.Value = "B" Range("AV16").Value = Target.Column End If 'C If Target.Value = "C" Or Target.Value = "C" Then Range("AV16").Value = Target.Column Target.Value = "C" Else End If ' If Target.Value = "C" Then If Target.Offset(0, -1).Value = "C" Then 'Cが連続したら Target.Offset(0, 1).Resize(1, 2).Value = ("休") '連休に Else End If Target.Offset(0, 1).Value = ("休")   'そうでなければ休 End If 'A,B,C の数をカウントする。 nin = Range("AV15")  '別のプログラムから入力した人員数 retsu = Range("AV16")  ' A,B,Cのいずれかを入力したセル列。Target.Column ’OK For cnt = 7 To (6 + nin) If cells(cnt, retsu) = "A" Then a1 = a1 + 1 End If If cells(cnt, retsu) = "B" Then b1 = b1 + 1 End If If cells(cnt, retsu) = "C" Then c1 = c1 + 1 End If Next cnt cells(nin + 7, retsu) = a1 'A番 cells(nin + 8, retsu) = b1 'B番 cells(nin + 9, retsu) = c1 'C番 End Sub

  • エクセルVBA任意の文字で検索しリストUPするには

    お世話になります。 恥ずかしながら、VBAはまるっきりの初心者でネットで落ちているものを かき集めて貼り合せることしかできません。 A列に仕入先名、 B列に品番、 C列に注文数 のデータがあり、 仕入先を指定して、注文数>0、の品番を別シートにコピペするマクロを作っています。 ここで、困っているのが、仕入先を正確に入力しないといけない点です。 特に株式会社の標記です。 株式会社、(株)、(株)、前(株)、後(株)、記号の株 など そこで、社名の一部だけ入力すれば検索できるようにしたいのですが、 どうしたらよいでしょうか? ワイルドカード * を使えばよいのかと思いましたが、うまくいきません。 都合の良い相談ですが、助けて頂けると幸いです。 Sub test() Dim name As Range Dim 仕入先 As String 仕入先 = Application.InputBox("検索仕入先入力") For Each name In Range("A1:A65536") ' 第1条件 仕入先 If name.Value <> 仕入先 Then GoTo Continue End If ' 第2条件 注文数 If name.Offset(0, 2).Value <= 0 Then GoTo Continue End If Dim aValue As String aValue = name.Offset(0, 1).Value Dim rngPaste As Range Set rngPaste = Worksheets("Sheet2").Range("A65536").End(xlUp) If rngPaste.Value <> "" Then Set rngPaste = rngPaste.Offset(1) End If rngPaste.Value = aValue Continue: Next End Sub

  • マクロが思うように動きません

    エクセル2007です。 初心者です。 マクロが思うように動きません。 指定のセルが空白の場合、msgboxを表示して、処理を抜ける 空白でない場合は、処理をつつける。 と言う事をしたいです。 with~の後が問題だと思うのですが・・ Sub 受注履歴書き込み() Dim ws01 As Worksheet, ws02 As Worksheet Dim r As Long, c As Integer, tmp As Long Set ws01 = Worksheets("受注書") Set ws02 = Worksheets("受注履歴") ws01.Activate With ws01 If .Range("C2").Value = "" _ And .Range("M2").Value = "" _ And .Range("M11").Value = "" _ And Worksheets("粗利報告書").Range("D3").Value = "" Then MsgBox "受注Noが空白です。処理を中止します。" Exit Sub ws02.Cells(r, 1).Value = .Range("C2").Value ' 受注No ws02.Cells(r, 9).Value = .Range("A40").Value ' 備考 ws02.Activate End If End With End Sub 採点願えますでしょうか? 宜しくお願い致します。

  • マクロ 条件分岐の仕方

    いつも回答ありがとうございます。 条件分岐について質問です。 文字に『N 』含まれている時の条件処理と、『N』が含まれていない時の条件処理を記述記述しました。一応、この記述で上手く動作しているので問題ないのですが、他に記述方法はないのでしょうか?宜しくお願い致します。 Sub 色を塗る2() Dim b As Long '仮シートの列 Dim res As Variant '色の設定 Dim c As Variant '最後に定期をした日付のセル番地 Worksheets("仮シート").Activate b = 2 Do While Worksheets("仮シート").Cells(2, b).Value <> "" With Worksheets(Worksheets("仮シート").Cells(2, b).Value) Set c = .Columns("C").Find("定期", , xlValues, 1, , 2).Offset(, -1) If Worksheets("仮シート").Cells(2, b).Value Like "*N*" Then If (Date - 30) <= c And c <= Date Then res = 8 ElseIf (Date - 60) <= c And c <= (Date - 31) Then res = 10 ElseIf c <= (Date - 61) Then res = 3 End If End If If Worksheets("仮シート").Cells(2, b).Value Like "*N*" = False Then If (Date - 10) <= c And c <= Date Then res = 8 ElseIf (Date - 30) <= c And c <= (Date - 11) Then res = 10 ElseIf c <= (Date - 31) Then res = 3 End If End If Worksheets("仮シート").Cells(3, b).Interior.ColorIndex = res End With b = b + 1 Loop End Sub

  • 「オブジェクトが必要です。」エラーになります。

    次のコードで2.は動くのですが、1.が動きません。「オブジェクトが必要です。」エラーになります。 何が違うんでしょうか? 教えてください。よろしくお願いします。 Function hoge(aa As Range) aa.Value = "Hello!!" End Function Sub Worksheet_Activate() Dim a As Range Set a = ThisWorkbook.Worksheets("Sheet1").Range("G10") hoge (a) ' ←1.これだとエラーになる ' hoge (ThisWorkbook.Worksheets("Sheet1").Range("G10")) ' 2.こちらはOK End Sub

  • マクロ セル参照時の記述

    いつも回答ありがとうございます。 似たような質問をしていますが、下記の記述の(b3.value!"$B$1").の箇所でエラーがかかりました。 .SetSourceData Source:=Range(b3.value!"$B$1").CurrentRegion どのように変更したら上手く動作するのでしょうか?b3は変数です。御指導の程宜しくお願い致します。 Sub グラフの作成() Dim Date1 As Date 'グラフの始点の日付 Dim Date2 As Date 'グラフの終点の日付 Dim SName As String '商品名 Dim b1 As Variant 'グラフの始点のセル番号 Dim b2 As Variant 'グラフの終点のセル番号 Dim b3 As Variant '対象の商品名のセル番号 Dim d1 As Variant 'b1と違う列のセル番号 Dim d2 As Variant 'b2と違う列のセル番号 Dim d3 As Variant 'b3と違う列のセル番号 With Worksheets("集計用") s1: Date1 = Application.InputBox("最初の日付を2012/12/1のように入力してください。") If Date1 = 0 Then MsgBox "キャンセルされました。", vbOKOnly Exit Sub End If Set b1 = .Columns("B").Find(Date1, , xlValues, 1) If b1 Is Nothing Then If MsgBox("入力した日付が見当たりません。" & vbNewLine & _ "再度入力しますか?", vbYesNo) = vbYes Then GoTo s1 Else MsgBox "処理を中止しました", vbOKOnly Exit Sub End If End If d1 = b1.Row s2: Date2 = Application.InputBox("最初の日付を2012/12/31のように入力してください。") If Date1 = 0 Then MsgBox "キャンセルされました。", vbOKOnly Exit Sub End If Set b2 = .Columns("B").Find(Date2, , xlValues, 1) If b2 Is Nothing Then If MsgBox("入力した日付が見当たりません。" & vbNewLine & _ "再度入力しますか?", vbYesNo) = vbYes Then GoTo s2 Else MsgBox "処理を中止しました", vbOKOnly Exit Sub End If End If d2 = b2.Row s3: SName = Application.InputBox("商品名を入力して下さい。") If SName = "False" Then MsgBox "キャンセルされました。", vbOKOnly Exit Sub End If Set b3 = .Rows("3").Find(SName, , xlValues, 1) If b3 Is Nothing Then If MsgBox("入力した商品名が見当たりません。" & vbNewLine & _ "再度入力しますか?", vbYesNo) = vbYes Then GoTo s3 Else MsgBox "処理を中止しました", vbOKOnly Exit Sub End If End If d3 = b3.Column Worksheets.Add After:=Worksheets("集計用") ActiveSheet.Name = b3.Value .Activate .Range(b1, b2).Copy _ Destination:=Worksheets(b3.Value).Range("B2") .Activate .Range(Cells(d1, d3), Cells(d2, d3)).Copy _ Destination:=Worksheets(b3.Value).Range("C2") With Worksheets(b3.Value).Range("D2:D" & Range("C65536").End(xlUp).Row) .Formula = "=SUM(C2,D1)" .Value = .Value End With End With Charts.Add With ActiveChart .ChartType = xlColumnClustered .SetSourceData Source:=Range(b3.value!$B$1").CurrentRegion With .Axes(xlValue) .MaximumScale = 10 .MajorUnit = 1 End With .Location Where:=xlLocationAsObject, Name:=b3.Value End With End Sub

専門家に質問してみよう