• 締切済み

【VBA】別々のシートに列ごとコピーしていきたい

エクセルVBA初心者です 以下のような表を、地区別にわけられたシートで、種別を選んで貼り付けていきたいのですが 地区 種別 1 大阪 金 2 東京 銀 3 名古屋 銀 4 大阪 金 5 大阪 銅 6 名古屋 銅 7 東京 金 8 名古屋 金 9 大阪 銅 金と銀のみ、地区に分けられたシートに貼り付け シート【大阪】 1 大阪 金 4 大阪 金 シート【東京】 2 東京 銀 7 東京 金 シート【名古屋】 3 名古屋 銀 8 名古屋 金 以下のVBAを加工してみましたが組んでみましたがうまくいきません どうかご教示のほどよろしくお願いします ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ Public Sub cptest() Dim sht1 As Worksheet Dim sht2 As Worksheet Dim rng As Range Dim cel As Range Dim stcrng As New Collection Dim lastRow As Integer Dim cnt As Integer Set sht1 = ThisWorkbook.Worksheets("Sheet1") Set sht2 = ThisWorkbook.Worksheets("Sheet2") lastRow = Range("G65535").End(xlUp).Row Set rng = sht1.Range("G1:G" & lastRow) For Each cel In rng If cel.Value = "あり" Then Set cel = sht1.Range(cel.Offset(0, -4), cel.Offset(0, -1)) stcrng.Add cel End If Next sht2.Cells.Clear cnt = 0 Set rng = sht2.Range("A1") For Each cel In stcrng cel.Copy rng.Offset(cnt, 0).PasteSpecial rng.Offset(cnt, 4).Value = "_" cnt = cnt + 1 Next Application.CutCopyMode = False End Sub

みんなの回答

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

提示ソースを出来るだけ活かそうと思いましたが、いまいち意図がわからず挫折しました。 「大阪」「東京」「名古屋」と言うシートが存在する前提のマクロです。 Sub Sample()   sCity = Split("大阪,東京,名古屋", ",")   Columns("G:G").Select   Selection.AutoFilter   For i = 0 To UBound(sCity)     Range("G:G").AutoFilter Field:=1, Criteria1:="=*" & sCity(i) & "*", Operator:=xlAnd, Criteria2:="<>*銅"     Range("G:G").CurrentRegion.SpecialCells(xlVisible).Copy Worksheets(sCity(i)).Range("G1")   Next i   Selection.AutoFilter End Sub

関連するQ&A

  • VBA 検索して一致したセルへジャンプさせたい

    Excelにて、シート1のA列とシート2のA列のデータにNoを入れます。 シート1のA列のNoをクリックすると、シート2のA列の同じNoにジャンプするマクロを組みたいです。 現在組んでいるマクロは、 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim Sht As Worksheet Dim Rng1 As Range Dim Rng2 As Range Dim FindCell As Range Set Sht = Worksheets("シート2") Set Rng1 = Range("A2:A100") Set Rng2 = Sht.Range("A2:A100")If Intersect(Target, Rng1) Is Nothing Then Exit Sub If Target.Count > 1 Then Exit Sub Set FindCell = Rng2.Find(Target.Value) If Not FindCell Is Nothing Then Application.Goto Reference:=FindCell, Scroll:=False End If End Sub です。 一応マクロは実行されますが、そうすると、シート1のA列の編集(Noを追加したり変更したり・・・)できません。 編集や変更もできて、検索マクロも実行できるというマクロの組み方はありますでしょうか?

  • VBA ループ処理 "型が違います"エラー

    "sheet1"のA1:J1を"sheet2"のA1:J1にコピー "sheet1"のA2:J2を"sheet2"のA2:J2にコピー "sheet1"のA3:J3を"sheet2"のA3:J3にコピー これを"sheet1"A:Jが空欄になるまでループさせたいのですが、 どうしてもエラーが出てしまいます。。。 前回も同様の質問をして、回答を頂いたのですが、 自分なりに応用を利かせてやってみたら、エラーが出てしまいます>< ------------------------------------------------------------ Sub cpy2() Dim i As Long Dim Sht1 As Range Dim Sht2 As Range Set Sht1 = Sheets("Sheet1").Range("A1:J1") ←("A1")ではエラーは出ません。 Set Sht2 = Sheets("Sheet2").Range("A1:J1") ←("A1")ではエラーは出ません。 For i = 0 To 65535 If Sht1.Offset(i) <> "" Then ←ここでエラーが出ます"型が違います" Sht2.Offset(i) = Sht1.Offset(i) Else Exit For End If Next End Sub -------------------------------------------------------------- 教えて下さい。お願いします。

  • VBAで文字列のカウントがうまくいかない・・・です

    Dim cnt As Long Dim i As Long Dim lastRow As Long For i = 1 to 20 step 2 lastRow = Cells(65536, i).End(xlUP).Row cnt = WorksheetFunction.CountIf(ActiveSheet.Range(Cells(10, i),Cells(lastRow, i), "お世話になっております")cnt = cnt + cnt Next Excelのセルを1列ずつ飛ばして列に「お世話になっております」が含まれたら件数をカウントしています。 そのカウント数が何故かリセットされてしまいます。 カウント数を足していきたいのですが・・・考え方自体が違うのでしょうか?

  • VBAの質問です

    1つめの質問。 Dim Sht2 As Worksheet Dim Sht3 As Worksheet Set Sht2 = Worksheets("sheet2") Set Sht3 = Worksheets("sheet3") Sht2.Range("A5").CurrentRegion.AdvancedFilter _ Action:=xlFilterCopy, _ criteriarange:=Sht2.Range("A132:A133"), _ copytorange:=Sht3.Range("A5"), _ Unique:=False というプログラムで,AdvancedFilterのところを後で繰り返し処理したいと思っているので,まずcriteriarange:=Sht2.Range("A132:A133"), _のところをcriteriarange:=Sht2.Range(Cells(132,1),Cells(33,1)), _としてみたのですがエラーが出てしまいます。なぜでしょうか。また,繰り返し処理するためにはcriteriarange:=Sht2.Range("A132:A133"), _のままではダメなのでしょうか。 2つめの質問。 ある行に何もデータがないときに限りその行を削除するというようなマクロはどうやればいいのでしょうか。出来たとしてもシートの下の方が全部消えてしまうので,適用する範囲を指定する必要がありそうですが。 よろしくお願い致します。

  • エクセルでの複数VBAの作業

     こんばんは。  お世話になります。  以下のコードをMicrosoft Visual Basicの「標準モジュール画面」にて記述し、作動させてみたのですが、  2つ目のSub lll()のみしか反映されないようで、”S”行のみしか値がえられませんでした。  何が問題なのか、初心者のわたくしには、わかりません。  お手数ですが、原因等をお教えいただければ、幸いでございます。 Sub hhh() Dim n As Long Dim rng As Range n = 2000 ReDim hh(1 To n, 1 To 1) Set rng = Range("C2:C31") For i = 1 To n hh(i, 1) = WorksheetFunction.Max(rng) Set rng = rng.Offset(30) Next i Range("R2").Resize(n) = hh End Sub Sub lll() Dim n As Long Dim rng As Range n = 2000 ReDim ll(1 To n, 1 To 1) Set rng = Range("D2:D31") For i = 1 To n ll(i, 1) = WorksheetFunction.Min(rng) Set rng = rng.Offset(30) Next i Range("S2").Resize(n) = ll End Sub

  • エクセル VBA の質問です。

    A2~A20までのセルに文字を入力した段階で、それぞれB2~B20に入力日時を入れるVBAを以下のように組んでいます。 しかし、同様の条件を同一シートのE2~E20・F2~F20にも入力・自動表示できるようにしなければならなくなり、困っています。 どのように記述を変えればよいのか、教えていただけたらと思います。 宜しく御願いいたします。 Sub Worksheet_change(ByVal Target As Range) Dim Rng As Range Dim c As Range Set Rng = Range("A2:A20") If Intersect(Target,Rng) Is Nothing Then Exit Sub For Each c In Intersect(Target,Rng) If Not IsEmpty(c) Then c.Offset(, 1).Value = Now Else c.Offset(, 1).ClearContents End If Next Rng.Offset(, 1).EntireColumn.AutoFit End Sub 申し訳ありませんが、何卒、宜しく御願いいたします。

  • ユーザー定義関数の再計算

    ユーザー定義関数を作りました。 ところが、この関数が自動再計算をしてくれません。 どうしたら自動再計算するようになるのでしょうか? よろしくお願いします。 ちなにこの関数は、自分のシートのB2とsheet1~sheet4のB9を比較して、正しければB9の4つ右のセルの値を合計して返すものです。 =SheetLook($B$2,"sheet1,sheet2,sheet3,sheet4",B9,4) コードです。 Function SheetLook(参照元 As Variant, 比較対象シート As String, 比較対象セル As Range, 参照セル位置 As Integer) As Variant   Dim i As Integer   Dim rng As Range   Dim sss As Variant   Dim kei As Variant   Dim cnt As Integer   sss = Split(比較対象シート, ",")   kei = 0   cnt = 0   For i = 0 To UBound(sss)     Set rng = Sheets(sss(i)).Range(比較対象セル.Address)     If 参照元 = rng Then       kei = kei + rng.Offset(0, 参照セル位置)       cnt = cnt + 1     End If   Next   If cnt <> 0 Then     SheetLook = kei   Else     SheetLook = ""   End If End Function

  • VBA マクロ シート 転記

    はじめまして。VBA初心者です。今シート1のA列1行目セルにA社、A列2行目にB社、A列3行目にC社と・・ざっと1000行程あり、それぞれB列には値があります。この値をシート2のB列に転記したいと思っています。ただ、毎月シートを追加していきますので、左隣のシートから転記しなければなりません。シート2の項目は同じA列とB列で構成されています。A列の値が多少前後するので、FINDを使って以下のようなプログラムを作りました。ただ、左隣のシートから転記とう内容をどうやって追加したら良いのかがわかりません。Previous をどこかに使えばできるのかなとも思うのですが、その方法がわかりません。 Sub 転記() Dim ws As Worksheet, ws1 As Worksheet, r As Range, r1 As Range Dim LastRow As Long, i As Long, er As Long, wkey As String Set ws = Worksheets("Sheet1") Set ws1 = Worksheets("Sheet2") LastRow = ws.Range("A1").End(xlDown).Row er = ws1.Range("A1").End(xlDown).Row Set r = ws.Range("A1:A" & LastRow) For i = 1 To er wkey = ws1.Range("A" & i) Set r1 = r.Find(What:=wkey, LookIn:=xlValues, LookAt:=xlWhole) If Not r1 Is Nothing Then ws1.Range("B" & i) = r1.Offset(, 1) End If Next Set r1 = Nothing Set r = Nothing Set ws = Nothing Set ws1 = Nothing End Sub どなたか詳しいお方いらっしゃいましたら、初心者の私に教えて頂けませんでしょうか?宜しくお願いします。

  • VBA OR条件での検索について教えてください。

    VBA初心者です。また質問させてください。 以前、下記のような表で、『小計』の文字を検索して行を挿入したり、斜め線を引くという内容をVBAでやる方法を教えていただきました。 その節はありがとうございました。 *************************************************************   A    B       C    D 1  2  項目 品名       数量   単位 3     内訳(別紙明細) 1     式 4     ブレーカ      1     ヶ 5     消耗品       1     式   6             7 8           小計 ************************************************************* 今度は『小計』だけでなく『合計』があった場合も、同じ処理をするVBAを作成したいのですがうまくいきません。 以下が記述です。 ************************************************************* Private Sub 斜め線描画_Click() Dim myLine As Shape Dim c As Range Dim cnt As Integer Dim i As Integer cnt = WorksheetFunction.CountIf(Cells, "*小   計*") Set c = Cells.Find(What:="小   計", LookIn:=xlFormulas, LookAt:=xlPart) If Not c Is Nothing Then i = 1 Call LineArranging(c) Do If i >= cnt Then Exit Sub 'カウントでチェック Set c = Cells.FindNext(c) If c Is Nothing Then Exit Sub Call LineArranging(c) i = i + 1 Loop End If Set c = Nothing End Sub Sub LineArranging(rng As Range) Dim BX As Double, BY As Double, EX As Double, EY As Double Dim rngStart As Range, rngEnd As Range Dim myLine As Shape rng.Select ActiveCell.Rows("1:2").EntireRow.Select Selection.Insert Shift:=xlDown rng.Offset(1, 0).Select ActiveCell.Rows("1:2").EntireRow.Select Selection.Insert Shift:=xlDown rng.Offset(-2, 0).Select Selection.EntireRow.Insert ActiveCell.EntireRow.Select Selection.RowHeight = 2 rng.Offset(1, 0).Select Selection.EntireRow.Insert ActiveCell.EntireRow.Select Selection.RowHeight = 2 Set rngStart = rng.Offset(1, -1) Set rngEnd = rng.Offset(-2, 0) BX = rngStart.Left BY = rngStart.Top EX = rngEnd.Left + rngEnd.Width EY = rngEnd.Top Set myLine = Sheet4.Shapes.AddLine(BX, BY, EX, EY) BX = BX + 151.5 BY = BY - 27 EX = EX - 152.25 EY = EY + 26.25 Set myLine = Sheet4.Shapes.AddLine(BX, BY, EX, EY) Set rngStart = Nothing Set rngEnd = Nothing Set myLine = Nothing End Sub ************************************************************* 『または』なのでorを使うのかと思ったのですが、エラーになりうまくいきません。どうしたらいいのか教えてください。 よろしくお願いします。

  • 複数のファイルのsheet1だけをまとめるには

    sub UsedRangeをOffsetする() Dim rng先 As Range Dim PathMacrobook As String Dim Name元book As String Dim 元Book As Workbook Dim 元Sheet As Worksheet Set rng先 = Workbooks("BOOKALL.xls").Worksheets(1).Range("A2") PathMacrobook = ThisWorkbook.Path & "\" Name元book = Dir(PathMacrobook & "*.xls") Do While Not Name元book = "" If Name元book = ThisWorkbook.Name Then ElseIf Name元book = "BOOKALL.xls" Then Else Set 元Book = Workbooks.Open(PathMacrobook & Name元book) For Each 元Sheet In 元Book.Worksheets With 元Sheet.UsedRange .Offset(1).Copy rng先 Set rng先 = rng先.Offset(.Rows.Count - 1, 0) End With Next 元Book.Close False End If Name元book = Dir() Loop End Sub このコードではフォルダにあるブックのすべてのシートをBOOKALLのシート1に 上書きコピーしてしまう事がわかりました。 やりたい事 オープンするブックのsheet1だけを、.end(xlup)を使って一覧にしたいです。。 どの様にしたらよいでしょうか?

専門家に質問してみよう