• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VB:アクティブなシート以外でのオートフィル)

VBでのオートフィルに関する初心者の質問

mitarashiの回答

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

下記コードは、シートがアクティブでなくても動作しました。 Sub test() With Worksheets(1) .Range(.Cells(1, 1), .Cells(3, 1)).FillDown End With With Worksheets(3) .Range(.Cells(1, 1), .Cells(4, 1)).FillDown End With End Sub ここで注意すべき点は、.Cells(...)の頭にも"."が付いている事です。 アクティブシート以外を操作する際は、Range()内のCells()によるセル指定についても、どのワークシートに所属するのかを明示してやらないと、'Cells'(またはRange)メソッドは失敗しました。'_Global'オブジェクトとかいった、訳の分からないエラーメッセージに悩まされる事になります。 なお、 ThisWorkbook.Worksheets(3).Active は、 ThisWorkbook.Worksheets(3).Activate が正しいです。

hijiriki
質問者

お礼

お礼が遅くなりました! >ここで注意すべき点は、.Cells(...)の頭にも"."が付いている事です。 まさにコレでした、直したらちゃんと動作しました。 アクティブシートで問題なく動作していたので、 "."が無くても省略のない正式な書式だと思い込んでいました。 ありがとうございました!

関連するQ&A

  • 実行時エラー1004 オートフィルができない

    エクセルなのですが、A列の文字にたいする数式をB列に入れて最終行までオートフィルするマクロを作りたいのですが実行時エラー1004が発生してしまいます。 Sub macro1() Dim LastRow As Long LastRow = Range("A65536").End(xlUp).Row Range("B1").Value = "=LEN(A1)" Range(Range("B1"), Selection).AutoFill Destination:=Range("B1:B" & LastRow) End Sub このコードです。 Range(Range("B1"), Selection). ここら辺が怪しいかなと思ってるのですが、どうすればいいでしょうか? オートフィルを使わずにfor~nextでやる方法も知ってますが、オートフィルでやる方法をご教授いただきたいです。 よろしくお願いします。

  • 横にコピーするには・・。

    教えてください・・。 01.xls・02.xls・03.xlsとあり、その中のシート(01・02・03)をコピーして、全部というシートにまとめたいと思っています。 列にデータを追加したいのですが、行にデータが追加されてしまいます・・。 どうしたらいいのか教えてください。 01のシートがAからDまで 02のシートがEからGまで 03のシートがHからLまで とコピーをしたいと思っています・・。 --------- PathName = ThisWorkbook.Path & "\" ArrBook = Array("01.xls", "02.xls", "03.xls") For i = LBound(ArrBook) To UBound(ArrBook) Workbooks.Open PathName & ArrBook(i) Next Set WS(1) = Workbooks("01.xls").Worksheets("01") Set WS(2) = Workbooks("02.xls").Worksheets("02") Set WS(3) = Workbooks("03.xls").Worksheets("03") Set WS(4) = ThisWorkbook.Worksheets("全部") With WS(4) .Cells.ClearContents .Cells(1, 1) = "A" .Cells(1, 2) = "B" .Cells(1, 3) = "C" .Cells(1, 4) = "D" .Cells(1, 5) = "E" .Cells(1, 6) = "F" .Cells(1, 7) = "G" .Cells(1, 8) = "H" .Cells(1, 9) = "I" .Cells(1, 10) = "J" .Cells(1, 11) = "K" .Cells(1, 12) = "L" .Cells(1, 13) = "M" .Cells(1, 14) = "N" .Cells(1, 15) = "O" .Cells(1, 16) = "P" .Cells(1, 17) = "Q" LastRow(1) = WS(1).Range("A65536").End(xlUp).Row LastRow(2) = WS(2).Range("A65536").End(xlUp).Row LastRow(3) = WS(3).Range("A65536").End(xlUp).Row For i = 1 To 3 LastRow(4) = .Range("A65536").End(xlUp).Row + 1 WS(i).Rows("2:" & LastRow(i)).Copy .Cells(LastRow(4), 1) LastRow(4) = .Range("A65536").End(xlUp).Row End With For i = LBound(ArrBook) To UBound(ArrBook) Workbooks(ArrBook(i)).Close SaveChanges:=False Next End Sub

  • VBA 検索するSheetの位置の変更

    現在、グループの数だけユーザー名の合計数をSheet2に抽出するという 事をやっているのですが....... コードの方は下記になります Sub Sample3() Dim i As Long, j As Long, k As Long, lastRow As Long, lastCol As Long Dim wS2 As Worksheet, wS3 As Worksheet Set wS2 = Worksheets("Sheet1") Set wS3 = Worksheets("Sheet2") Application.ScreenUpdating = False If wS2.Range("Y1") = "" Then wS2.Range("Y1") = "ダミー" End If With Worksheets("Sheet1") If .Range("A4") = "" Then .Range("A4") = "ダミー" End If lastRow = .Cells(Rows.Count, "B").End(xlUp).Row Range(.Cells(5, "B"), .Cells(lastRow, "B")).AdvancedFilter Action:=xlFilterCopy, copytorange:=wS3.Range("A1"), unique:=True '★ For i = 2 To wS3.Cells(Rows.Count, "A").End(xlUp).Row wS2.Cells(7, (i - 2) * 8 + 3) = wS3.Cells(i, "A") .Range("A4").AutoFilter field:=2, Criteria1:=wS3.Cells(i, "A") Range(.Cells(5, "AA"), .Cells(lastRow, "AA")).SpecialCells(xlCellTypeVisible).Copy wS2.Cells(7, (i - 2) * 8 + 2) For k = wS2.Cells(Rows.Count, (i - 2) * 8 + 2).End(xlUp).Row To 7 Step -1 wS2.Cells(k, (i - 2) * 8 + 3) = WorksheetFunction.CountIfs(.Range("AA:AA"), wS2.Cells(k, (i - 2) * 8 + 2), .Range("B:B"), _ wS2.Cells(7, (i - 2) * 8 + 3)) If WorksheetFunction.CountIf(wS2.Columns((i - 2) * 8 + 2), wS2.Cells(k, (i - 2) * 8 + 2)) > 1 Then wS2.Cells(k, (i - 2) * 8 + 2).Resize(, 2).Delete shift:=xlUp End If Next k Next i wS2.Range("B1").CurrentRegion.Borders.LineStyle = xlContinuous wS2.Cells.Replace what:="ダミー", replacement:="", lookat:=xlWhole .Cells.Replace what:="ダミー", replacement:="", lookat:=xlWhole wS3.Cells.Clear .AutoFilterMode = False End With Application.ScreenUpdating = True End Sub このコードで検索をかけるSheet1のセルBの文字をセルCに移動して検索かけたいという事なのですが、下記の用なコードでBをCに変更してみた結果エラーが発生してしまいます。 lastRow = .Cells(Rows.Count, "C").End(xlUp).Row Range(.Cells(5, "C"), .Cells(lastRow, "C")).AdvancedFilter Action:=xlFilterCopy, copytorange:=wS3.Range("A1"), unique:=True '★ For i = 2 To wS3.Cells(Rows.Count, "A").End(xlUp).Row wS2.Cells(7, (i - 2) * 8 + 3) = wS3.Cells(i, "A") .Range("A4").AutoFilter field:=2, Criteria1:=wS3.Cells(i, "A") Range(.Cells(5, "AA"), .Cells(lastRow, "AA")).SpecialCells(xlCellTypeVisible).Copy wS2.Cells(7, (i - 2) * 8 + 2) For k = wS2.Cells(Rows.Count, (i - 2) * 8 + 2).End(xlUp).Row To 7 Step -1 wS2.Cells(k, (i - 2) * 8 + 3) = WorksheetFunction.CountIfs(.Range("AA:AA"), wS2.Cells(k, (i - 2) * 8 + 2), .Range("C:C"), _ どなたかご教授の方お願い致します。

  • VBA 類似シート名 処理

    シート名が、「一覧 (2)」、「一覧 (3)」、・・・・・「一覧 (n)」、と連続する各シートの表データを「一覧」という名前のシートにまとめたいのですが、やり方が分かりません。 For Each を使えば出来るんじゃないかと調べましたが、見付けられませんでした。 シート処理以外は、   Dim CoR As Long, PaR As Long, PaR2 As Long CoR = Worksheets(???).Cells(Rows.Count, 1).End(xlUp).Row PaR = Worksheets("一覧").Range(Rows.Count, 1).End(xlUp).Row PaR2 = CoR + PaR + 1 Worksheets(???).Range(Cells(2, 1), Cells(CoR, 12)).Copy Worksheets("一覧").Range(Cells(PaR, 1), Cells(PaR2, 12)).PasteSpecial Paste:=xlPasteValues こんな感じで作っています。 作り方、もしくは参考になるサイトがありましたら、教えていただければありがたいです。 よろしくお願いします。

  • VBAで列が可変のオートフィルの実装

    元となるSheet1のR列を「Sheet1~3」以外のシートの名前で オートフィルターさせてその内容をコピーし、数式を代入させたあと、連続データをEの列の最終セルまで 連続させてコピーするという下記のVBAを実装しました・・・が 連続データさせるEの列が1つしかなかった場合、連続データできないのでエラーが起きてしまします ですのでそれは無視してよいと単純に「On Error Resume Next」で処理しちゃってます でもこれでは、あまり良くない処理のような気がするのですが・・・ 連続データ出来ない場合は、1つのセルに数式を代入するだけでおしまい というプログラム処理はどのようにやればいいのでしょうか? ' オートフィルター For Each sh In Worksheets If sh.Name <> "Sheet1" And sh.Name <> "Sheet2" And sh.Name <> "Sheet3" Then Dim Filtarget As Range Dim Maction As Range 'コピーの開始する場所 Set Filtarget = Sheets(sh.Name).Range("A4") Set Maction = Sheets(sh.Name).Range("W4") Set Fills = Sheets(sh.Name).Range("X4") With Sheets("Sheet1").Range("R3") .AutoFilter Field:=18, Criteria1:=sh.Name .CurrentRegion.Copy With Worksheets.Add .Paste .Range("1:3").Delete .UsedRange.Copy Filtarget .Range("X1").Formula = "=E1/W1" .Range("M1:M" & Cells(Rows.Count, 13).End(xlUp).Row).SpecialCells(xlCellTypeVisible).Copy Maction .Range("X1").AutoFill Destination:=Range("X1:X" & Cells(Rows.Count, 5).End(xlUp).Row).SpecialCells(xlCellTypeVisible) On Error Resume Next .Range("X1:X" & Cells(Rows.Count, 5).End(xlUp).Row).SpecialCells(xlCellTypeVisible).NumberFormatLocal = "\#,##0;\-#,##0" .Range("X1:X" & Cells(Rows.Count, 5).End(xlUp).Row).SpecialCells(xlCellTypeVisible).Copy Fills Application.DisplayAlerts = False .Delete Application.DisplayAlerts = True End With .AutoFilter Field:=18 End With End If Next 以上、よろしくお願い致します。

  • VBA 任意のシートからコピーを始める。

    教えてください。 全てのシートをコピーして一つのシートにまとめるプログラムシートを作成しました。 1番目のシートからコピーを始める場合は For i = 2 To Worksheets.Count 2番目のシートからコピーを始める場合は For i = 3 To Worksheets.Count とすればよいのですがこれだといちいちモジュールコードを出して数字を変更しなければならず面倒です。 そこでユーザーフォームのコンボボックスに任意の数字を入れてクリックを押せば希望するシートからコピーを始めるプログラムを作成してみましたがうまくいきません。どなたか教えてくださいませんか。 Sub matome() Dim i As Integer Dim lRow As Long, lCol As Long, lRow2 As Long, lRow3 As Long, SNo As Integer '----何番目からコピーを始めるかを決定します With UserForm2 SNo = .ComboBox1.value End With For i = 1 + SNo To Worksheets.Count With Worksheets(i) lRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1 lCol = .Cells(1, Columns.Count).End(xlToLeft).Column '----シートのデータが2行以上の場合にコピーします If lRow >= 2 Then lRow2 = Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row + 1 If lRow2 < Worksheets(1).Cells(Rows.Count, 5).End(xlUp).Row + 1 Then lRow2 = Worksheets(1).Cells(Rows.Count, 5).End(xlUp).Row + 1 .Activate .Range(Cells(2, 1), Cells(lRow, lCol)).Copy Worksheets(1).Cells(lRow2, 1) End If End With Next i

  • 他のブックでマクロを実行するには?

    以下のマクロを実行すると同一ブック内の他のシートに入力 されますが、これを他のブックのシートに入力されるように するには、具体的にどのようにすればいいのでしょうか? ご教授ください。 ---------------------------------------------------------------- Sub 入力() Dim LastRow As Long With Worksheets("sheet2") LastRow = Worksheets("sheet2").Range("B" & Rows.Count).End(xlUp).Row + 1 .Range("B" & LastRow).Value = Worksheets("sheet1").Range("B1").Value .Range("C" & LastRow).Value = Worksheets("sheet1").Range("B3").Value .Range("D" & LastRow).Value = Worksheets("sheet1").Range("B5").Value .Range("E" & LastRow).Value = Worksheets("sheet1").Range("B7").Value .Range("F" & LastRow).Value = Worksheets("sheet1").Range("B9").Value .Range("G" & LastRow).Value = Worksheets("sheet1").Range("B11").Value End With End Sub

  • EXCEL VBA オートフィルで別シートへコピー

    EXCEL VBA オートフィルで別シートへコピー しようとしたら、うまくいきません 別々に書くとうまくいくのですが コードを一緒にするとうまくいきません? コード *********************************************** Sub 抽出別シート() Worksheets("時間合計VB").Select ' 時間合計VBのシートを選択 Range("A1").AutoFilter field:=8, Criteria1:="<=1" '1時間以下の8列目のをフィルター end sub sub カレントで別シートへコピー() Range("A1").CurrentRegion.Copy Sheets("1hdown").Range("A1")   'それをカレントして別シートのA1へコピー Range("A1").AutoFilter End Sub *********************************************** このように書くとうまくいくのですが これを一緒に書くと別シートへコピーがうまくいきません。 全てコピーされてしまいます +++++++++++++++++++++++++++++++++++++++++++++++ 一緒にしたコードです +++++++++++++++++++++++++++++++++++++++++++++++ *********************************************** Sub 抽出別シート() '1h以下をを抽出別シートへコピー Worksheets("時間合計VB").Select ' 時間合計VBのシートを選択 Range("A1").AutoFilter field:=8, Criteria1:="<=1"    '1時間以下の8列目のをフィルター Range("A1").CurrentRegion.Copy Sheets("1hdown").Range("A1")    'それをカレントして別シートのA1へコピー Range("A1").AutoFilter End Sub *********************************************** 意味が分かりませんどなたかおしえていただけませんでしょうか? よろしくお願いいたします

  • 決まったシートだけコピーして一つのシートにまとめる

    お世話になります。 http://okwave.jp/qa/q8216220.html で質問させていただいたVBAをこねくり回してみたのですが、「インデックスが有効範囲にありません」というエラーがでて進まなくなってしまいました。 Sub 特定のシートだけコピーと貼り付け() Dim k As Long, endRow As Long, wS As Worksheet Dim P As Variant P = Array("全", , "A", "B", "C", "D", "E", "F", "G", "H", "I") '↑コピーしたいシート名一覧 Set wS = Worksheets("まとめ") endRow = wS.cells(Rows.Count, "B").End(xlUp).Row If endRow > 4 Then Range(wS.cells(5, "B"), wS.cells(endRow, "M")).ClearContents End If For k = LBound(P) To UBound(P) ☆If Worksheets(k).Name <> "まとめ" Then 'ワークシート名が"まとめ"のとき endRow = Worksheets(P).cells(Rows.Count, "B").End(xlUp).Row 'P=Arrayで指定しているシートのセルで If endRow > 4 Then '4行目より下を Range(Worksheets(P).cells(5, "B"), Worksheets(P).cells(endRow, "M")).Copy _ wS.cells(Rows.Count, "B").End(xlUp).Offset(1) 'B5からM列の任意のデータが入っているセルまでコピーして"まとめ"シートに貼り付け End If '繰り返す End If '繰り返す Next k '次のシートへ End Sub 自分で分かるようにコメントを付けています。 ☆のついているところで、「インデックスが有効範囲にありません」と出ます。 指定したシートに"まとめ"を追加してみてもやはり同じでした。 調べたところ、「インデックスが~」というのはVBA中の範囲にないものを指定しているからだ、ということなのですが・・・。 お知恵を貸して下さい。よろしくお願いします。

  • Excelマクロ オートフィルター条件設定で不等号を使いたい

    Excelマクロ オートフィルター条件設定で不等号を使いたい 請求シートより抽出条件シートに条件を設定し、抽出シートにコピーするマクロ を作成しています。 抽出条件に比較演算子の不等号<>を使った場合、条件が無視されてしまいます。 どのようにしたら良いでしょうか? 請求シートのA列には会社番号が数字4桁で入力されています。 抽出条件シートA5セルに下記の条件を設定した場合、 1と2の場合は上手くフィルターが機能しますが、3の不等号を 使った場合は機能しません。どなたか宜しくお願いします。 1:1000 2:>1000 3:<>1000 Sub テスト() Dim LastRow As Long, LastColumn As Long Dim myData As Range Dim myCriteria As Range With Worksheets("請求") LastColumn = .Cells(5, Application.Columns.Count).End(xlToLeft).Column LastRow = .Cells(Application.Rows.Count, "A").End(xlUp).Row Set myData = .Range("A5", .Cells(LastRow, LastColumn)) End With Set myCriteria = Worksheets("抽出条件").Range("A5").CurrentRegion Worksheets("抽出").Range("A6:R1000").ClearContents myData.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=myCriteria, _ CopyToRange:=Worksheets("抽出").Range("A5:R5"), Unique:=False Set myData = Nothing Set myCriteria = Nothing End Sub