オブジェクトが定義されていません

このQ&Aのポイント
  • オブジェクトが定義されていないため、エラーが発生します。
  • With文の使い方が間違っている可能性があります。
  • 詳細なコードを確認して、適切なオブジェクトを定義してください。
回答を見る
  • ベストアンサー

オブジェクトが定義されていません

以下のコードを実行すると「オブジェクトが定義されていません」とエラー表示されます。 オフィス2003、エクセルVBAです。 Withの使い方がまちがっているのでしょうか? 分かる方教えてください。 お手数をおかけしますがよろしくお願いします。 intGyou = Int(intDeley(i) * 2) With ThisWorkbook.Sheets(\"default\") If intDeley(i) = 0 Then .Range(\"Y7:Y1446\").Copy _ .Range (\"Z7:Z1446\") Application.CutCopyMode = False Else .Range(.Cells(intGyou + 7, 25), .Cells(1446, 25)).Copy _ .Range (\"Z7\") .Range(.Cells(7, 25), .Cells(intGyou + 6, 25)).Copy _ ThisWorkbook.Sheets(\"default\").Range(.Cells(1447 - intGyou, 26), .Cells(1446, 26)) Application.CutCopyMode = False End If End With

  • ddtqp
  • お礼率68% (139/203)

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

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.2

理由は不明ですが、Withステートメントを使って COPYメソッドを2行にした場合に質問のエラーが出るようなので Copyメソッドは1行で使うか 2行目では名前付き引数destinationを使うか のどちらかを使用すればいいでしょう。 '-------------------------------------------------- .Range("Y7:Y1446").Copy .Range("Z7") .Range(.Cells(intGyou + 7, 25), .Cells(1446, 25)).Copy .Range("Z7") .Range(.Cells(7, 25), .Cells(intGyou + 6, 25)).Copy .Cells(1447 - intGyou, 26) '------------------------------------------------------- .Range("Y7:Y1446").Copy _    Destination:=.Range("Z7") .Range(.Cells(intGyou + 7, 25), .Cells(1446, 25)).Copy _    Destination:=.Range("Z7") .Range(.Cells(7, 25), .Cells(intGyou + 6, 25)).Copy _    Destination:=.Cells(1447 - intGyou, 26) '------------------------------------------------------- また、上記のようにコピー先のセルは、先頭セルのみ指定した方が間違いがなくていいでしょう。 以上です。  

ddtqp
質問者

お礼

いろいろ試したのですが、確かにWith使用時Destinationをつけたら動作オッケーでした。 以下のコードのように貼り付け先も、間違いが少ないように先頭セル指定に変えました。 助かりました。ありがとうございます。 intGyou = Int(intDeley(i) * 2) With ThisWorkbook.Sheets("default") If intDeley(i) = 0 Then .Range("Y7:Y1446").Copy _ Destination:=.Range("Z7") Application.CutCopyMode = False Else .Range(.Cells(intGyou + 7, 25), .Cells(1446, 25)).Copy _ Destination:=.Range("Z7") .Range(.Cells(7, 25), .Cells(intGyou + 6, 25)).Copy _ Destination:=.Cells(1447 - intGyou, 26) Application.CutCopyMode = False End If End With

その他の回答 (1)

  • rivoisu
  • ベストアンサー率36% (97/264)
回答No.1

\記号の意味は? ThisWorkbook.Sheets(\"default\") 通常 Worksheets("Sheet1")  (シート名がSheet1のとき) 同様に Range(\"Y7:Y1446\").Copy _ .Range (\"Z7:Z1446\") という書き方も変 Copyの後のアンダーバーも意味がわからない アンダーバーはセンテンスを次の行につなげる(一行が長くなるときに使用)ものです。 コピペするときは Range("Y7:Y1446").Copy Range("Z7:Z1446").Paste 後のほうでは Range(.Cells(7, 25), .Cells(intGyou + 6, 25)) という書き方をしているのでRange("Y7:Y1446")という書き方よりこっち側の書き方に統一したらいいのでは

ddtqp
質問者

補足

>\記号の意味は? ほんとうですね。アップしたら「\」が表示されていますね。 メモ帳の文字を貼り付けたので、ユニコードか何かの違いででてきたのでしょうか。 >Range(\"Y7:Y1446\").Copy _ >.Range (\"Z7:Z1446\") >という書き方も変 >Copyの後のアンダーバーも意味がわからない copy,pasteを使用するとクリップボードを経由して遅くなるんです。 下記のようにDestinationをつけると見慣れたものでわかりやすいと思います。 Worksheets("Sheet1").Range("A1:B10").Copy _ Destination:=Worksheets("Sheet2").Range("A1") >Range(.Cells(7, 25), .Cells(intGyou + 6, 25)) >という書き方をしているのでRange("Y7:Y1446")という書き方よりこっち側の書き方に統一したらいいのでは すいません。間違いをみつけやすいようにあえてRange("Y7:Y1446")と記述しています。

関連するQ&A

  • ExcelのCopy&Pastsについて

    セルを1個づつ上にずらせ1番下に新しいデータを書き込むようにしたくて次のようなプロシージャーで行っていますが 'PROG1: Sheets("sheet2").Select Range("V10:Z98").Select Selection.Copy Range("V9").Select ActiveSheet.Paste Application.CutCopyMode = False PROG1:4回繰り返します。 sheet1で作業をしていて上のように実行しますと画面が4回動いてしまします。 'PROG2: If Sheets("sheet2").Range("A23") = "MC1" Then Set objFrom = ThisWorkbook.Worksheets("あきない02") Set objTo = ThisWorkbook.Worksheets("あきない02") For i = 10 To 98 For j = 22 To 26 'objFrom.Cells(i, j).Copy Destination:=objTo.Cells(i - 1, j) objTo.Cells(i - 1, j).Value = objFrom.Cells(i, j).Value Next j Next i End If PROG2を4回繰り返します。すると画面は動かなくていいのですが終わるまでに3分ほどかかります。 画面を動かさずにもっと早くできる方法はないでしょうか?

  • VBA アプリケーション定義またはオブジェクト定義エラーについて

    doc_wbkというブックのSheets(2)の内容をdoc_wbk2のActiveSheetにコピーしようとしています。 以下のコードの5行目で「アプリケーション定義またはオブジェクト定義エラー」が出てしまいます。ブックやシートまで指定しないといけないのかと思い doc_wbk.Sheets(2) を5行目行頭に追加しましたが変わりません。逆に5行目行頭の . を外してやるとアクティブシートの内容をコピーしてしまいます。Sheets(2)の内容をコピーしてやるにはどうしたらよいでしょうか?よろしくお願いします。 Set doc_wbk = Workbooks.Open(doc_dir + doc_file, 0) With Sheets(2) If .Range("A4").Value <> "" Then row_num = .Range("a65536").End(xlUp).Row .Range(Cells(4, 1), Cells(row_num, 11)).Copy doc_wbk2.ActiveSheet.Cells(row_num2 + 1, 1) End If End With

  • オブジェクトが必要です

    またまた困ってます、、 このコードを実行したとき .Range("H" & i).Copy.wsDetail.Range ("D24") ここでエラーが起きて 「オブジェクトが必要です」 と言われてしまいます(・・;) だれかよろしくお願いします<m(__)m> ※シートの宣言は上でやってます Private Sub 社会保険() Dim i Dim endrow As Long Dim kihon As Long Set wshoken = Worksheets("各種保険料表") Set wsDetail = Worksheets("給与明細") Set wsData = Worksheets("データ入力") kihon = WorksheetFunction.Round(wsData.Range("C5"), -4) endrow = Cells(Rows.Count, 3).End(xlUp).Row With wshoken For i = 2 To endrow If kihon = .Range("C" & i) Then .Range("H" & i).Copy.wsDetail.Range ("D24") .Range("L" & i).Copy.wsDetail.Range ("H24") .Range("N" & i).Copy.wsDetail.Range ("L24") Application.CutCopyMode = False End If Next i End With End Sub

  • VBA 重たいためコード改善お願いします

    VBA歴3か月の学習者です。 セルに入力された行数をもとに、セル範囲を決め、シートXYにコピペをするコードを作りました。 コード自体は、思い通りに動いていますが、1000回程度のループ処理を考えており、すべて終わるのに1時間程度かかってしまっています。 よろしければ、下記コード内で、時間を短縮できる編集のアドバイスをお願いいたします。 Sub test() Dim i, LastR, TopR, BottomR, myRow As Long Dim SheetD, SheetX, SheetY, SheetSu, mySheet As Worksheet Dim ColumnF, ColumnL, n As String Dim ResultRange As Range Application.ScreenUpdating = False Set SheetD = Sheets("D") Set SheetX = Sheets("X") Set SheetY = Sheets("Y") Set SheetSu = Sheets("Sum") Set ResultRange = SheetSu.Range("Z6:BT6") ColumnF = "A" ColumnL = "M" LastR = SheetD.Range(ColumnF & Rows.Count).End(xlUp).Row TopR = 2 i = 2 Do Until SheetD.Cells(i, "X") = "" And SheetD.Cells(i, "Y") = "" If SheetD.Cells(i, "X") = "" Or SheetD.Cells(i, "Y") = "" Then i = i + 1 Else With SheetD TopR = .Cells(i, "X").Value BottomR = .Range("B" & TopR).End(xlDown).Row .Range(ColumnF & TopR & ":" & ColumnL & BottomR).Copy End With With SheetX .Columns(ColumnF & ":" & ColumnL).ClearContents .Range("B1").PasteSpecial Paste:=xlPasteValues End With With SheetD TopR = .Cells(i, "Y").Value BottomR = .Range("B" & TopR).End(xlDown).Row .Range(ColumnF & TopR & ":" & ColumnL & BottomR).Copy End With With SheetY .Columns(ColumnF & ":" & ColumnL).ClearContents .Range("B1").PasteSpecial Paste:=xlPasteValues End With ResultRange.Offset(Cells(Rows.Count, "Z").End(xlUp).Row - 5).Value = ResultRange.Value i = i + 1 End If Loop Application.CutCopyMode = False SheetX.Columns(ColumnF & ":" & ColumnL).ClearContents SheetY.Columns(ColumnF & ":" & ColumnL).ClearContents Application.ScreenUpdating = True MsgBox "Finish" End Sub

  • ブックの統合について

    Sub 集計() Application.ScreenUpdating = False fldPath = ThisWorkbook.Path & "\" fname = Dir(fldPath & "*.xls") Do Until fname = Empty If fname <> ThisWorkbook.Name Then Workbooks.Open fldPath & fname mx = Application.WorksheetFunction.Max(Sheets("1日").Columns(1)) lr = Sheets("1日").Range("B65536").End(xlUp).Row FR = ThisWorkbook.Sheets("1日").Range("B65536").End(xlUp).Row + 1 Sheets("1日").Rows("6:" & lr).Copy Application.DisplayAlerts = False ActiveWorkbook.Close (False) Application.DisplayAlerts = True ThisWorkbook.Sheets("1日").Cells(FR, 1).Select ActiveSheet.Paste Application.CutCopyMode = False End If fname = Dir Loop Application.ScreenUpdating = True End Sub 上記のようにマクロを組みましたが、集計したいシートがたくさんある為 シートごとにマクロを組みなおさなければなりません。 そこで、 集計するシートと集計されるシートのシート名が一緒の時、 わざわざsheets("1日")と書き直さなくても "Activesheetと同じシート名"のようなマクロの組み方は出来るのでしょうか。

  • 簡単マクロ編集

    Sheets("Sheet1").Select  ←Range("A3:H8") Selection.Copy Sheets("Sheet2").Select Range("A3").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet4").Select Application.CutCopyMode = False ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True 下方にこの操作を繰り返ししたいのですが Dim i As Long Worksheets("Sheet1").Select For i = 3 To 100 Step 6 If Cells(i, "A") = "" Then Exit Sub End If Cells(i, "A").Resize(6, 8).Copy Destination:=Worksheets("Sheet2").Range("A3:H8") Next i 貼付けは値で貼り付けたいと思います。 どう組み合わせればよいですか?

  • Application.Dialogs(xlDialogSaveAs)でキャンセルの取得

    エクセル2000です。 Sheet1を複製し名前をつけて保存するマクロを書きました。 以下のとおりですが、キャンセルされた場合でも「保存しました」のメッセージが出てしまいます。 キャンセルされたことを取得するにはどう書けばいいでしょうか? Sub tesy01() Dim ns As Workbook Dim fn As String Sheets("Sheet1").Copy Set ns = ActiveWorkbook With ns.Sheets(1) .Cells.Copy .Cells.PasteSpecial Paste:=xlValues Application.CutCopyMode = False fn = .Range("A1") & Format(Date, "yymmdd") End With Application.Dialogs(xlDialogSaveAs).Show ARG1:=fn & ".xls", ARG2:=1 ns.Close (False) Set ns = Nothing MsgBox "保存しました。" ThisWorkbook.Activate Sheets("Sheet1").Activate End Sub

  • エクセルのマクロで繰り返し処理

    当方マクロ初心者ですが下記のマクロをCheckBox0~CheckBox23についてコピーするセルを変化させながら繰り返し処理を行いたいのですが、簡単なループ処理で行えますか? 教えていただければ幸いです。 If CheckBox0.Value = True Then Worksheets("sheets1").Activate  行 = Worksheets("sheets1").Range("e7")   行 = 行   Worksheets("sheets1").Range("g7:t7").Copy Windows("Books1.xls").Activate Sheets("sheets1").Select Range(Cells(行, 15), Cells(行, 15)).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False End If

  • マクロ編集プリントアウト

    Sheets("Sheet1").Select Selection.Copy Sheets("Sheet2").Select Range("A3").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet4").Select Application.CutCopyMode = False ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True Sheets("Sheet1").Select Range("A9").Select Sheets("Sheet1").Select Selection.Copy Sheets("Sheet2").Select Range("A3").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet4").Select Application.CutCopyMode = False ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True Sheets("Sheet1").Select Range("A15").Select これで2回プリントアウトされていることになります。 6行ずつ下方にデータが続いています。 データ行数は常に変化します。 dim i as long  for i = 3 to 99 step 6   if worksheets("Sheet1").cells(i, "A") = "" then    worksheets("Sheet2").range("A3:H8").value = worksheets("Sheet1").cells(i - 6, "A").resize(6, 8).value       end if  next i を使用してうまくまとめることはできるでしょうか?

  • <excel:VBA>変数を使って簡略化したい

    google検索してなんとか自力で作ったVBAを下記に貼りました。 きちんと動作はするのですが、せっかくなので変数を使って簡素化し、 データが多くても動作が速くなるようにしたいのです。 いろいろ試しましたが、変数の使い方の知識が乏しく、うまくいきませんでした。 変数としたいのは■マークの2箇所になると思います。 詳しい方、力を貸していただけないでしょうか。 どうぞよろしくお願いいたします。 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ Sub オートフィルタ貼付作業() With Sheets("データ").Range("A3") Application.ScreenUpdating = False Range("AA3:EK3").AutoFilter .AutoFilter Field:=1, Criteria1:="1" ’■Fieldが1ずつ増えていく Range("AA3").Copy Range("Z3") ’■AA3が1列ずつ右へずれていく .CurrentRegion.Copy Sheets("貼付").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) Range("A3").AutoFilter Range("AA3:EK3").AutoFilter .AutoFilter Field:=2, Criteria1:="1" Range("AB3").Copy Range("Z3") .CurrentRegion.Copy Sheets("貼付").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) Range("A3").AutoFilter ~~~~~~~~~~~~ 115列分のデータがあり 下記まで同じようにつづきます ~~~~~~~~~~~~ Range("AA3:EK3").AutoFilter .AutoFilter Field:=115, Criteria1:="1" Range("ek3").Copy Range("Z3") .CurrentRegion.Copy Sheets("貼付").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) Range("A3").AutoFilter End With Application.ScreenUpdating = True Sheets("貼付").Activate Cells.Columns.AutoFit End Sub ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

専門家に質問してみよう