- ベストアンサー
Excel(マクロなど)に関する質問
- とあるデータを作成したいが手作業だとミスが発生する可能性が高いため、できる限り手作業を減らしたい。
- シート1のデータをシート2のエリア名を入れ込んで完成させたいが、エリア名が多すぎて間違える可能性がある。
- 自動化やミスを減らす方法、早くできる工程を知りたい。マクロを使用するが場合によってはデータがずれてしまう。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは! 一例です。 Sheet2「区」のデータはA列の2行目からあるとします。 Alt+F8キー → VBE画面が出ますので、↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub test() 'この行から Dim i, j, k As Long Dim ws1, ws2 As Worksheet Set ws1 = Worksheets("sheet1") Set ws2 = Worksheets("sheet2") For i = 2 To ws2.Cells(Rows.Count, 1).End(xlUp).Row '※注 j = ws1.Cells(Rows.Count, 1).End(xlUp).Row - 4 If ws1.Cells(j, 2) <> ws2.Cells(i, 1) Then Range(ws1.Cells(j, 1), ws1.Cells(j + 4, 3)).Copy ws1.Cells(Rows.Count, 1).End(xlUp).Offset(1).Select ActiveSheet.Paste k = ws1.Cells(Rows.Count, 1).End(xlUp).Row - 4 Range(ws1.Cells(k, 2), ws1.Cells(k + 4, 3)) = ws2.Cells(i, 1) End If Next i Application.CutCopyMode = False ws1.Cells(Rows.Count, 1).End(xlUp).Offset(1).Select End Sub 'この行まで 尚、Sheet2の「区」のデータがA列の1行目からある場合は コード内の ※注 の行を >For i = 1 To ws2.Cells(Rows.Count, 1).End(xlUp).Row に変更してみてください。 以上、参考になれば良いのですが 外していたらごめんなさいね。m(_ _)m
その他の回答 (4)
- kagakusuki
- ベストアンサー率51% (2610/5101)
今仮に、Sheet2において「青葉区」と入力されているセルが、Sheet2のA1セルであるものとします。 まず、適当な空きシート(例えばSheet3)のA4セルに次の関数を入力して下さい。 =IF(INDEX(Sheet2!$A:$A,ROUNDUP(ROWS($4:4)/5,0))="","",IF(ISNUMBER(Sheet1!A$4),Sheet1!A$4,SUBSTITUTE(Sheet1!A$4,Sheet2!$A$1,INDEX(Sheet2!$A:$A,ROUNDUP(ROWS($4:4)/5,0))))) 次に、以下の操作を行って下さい。 Sheet3のA4セルにカーソルを合わせてマウスを右クリック ↓ 現れた選択肢の中にある[コピー]をクリック ↓ 名前ボックス(A1セルの上にある、選択したセル範囲等が表示される欄)に、 A4:C7503 などという具合に、Sheet1の表を全てカバーするのに充分なだけのセル範囲を入力 ※上記はエリア数が1500の場合の話で Sheet1の表の行数は3+1500×5=7503行が必要となります。 (カバーする範囲の方が広ければ、丁度同じだけの範囲である必要はありません) ↓ A4:C7503のセル範囲が選択されている状態で、選択範囲を示す黒い太枠の内側にカーソルを合わせてマウスを右クリック ↓ 現れた選択肢の中にある[コピー]をクリック ↓ Sheet1のA4セルにカーソルを合わせてマウスを右クリック ↓ 現れた選択肢の中にある[形式を選択して貼り付け]をクリック ↓ 現れた「形式を選択して貼り付け」ダイアログボックスの「値」と記されている箇所をクリックして、チェックを入れる ↓ 「形式を選択して貼り付け」ダイアログボックスの[OK]ボタンをクリック ↓ 必要があれば、[形式を選択して貼り付け]機能を使用して、Sheet1の4行目の書式をコピーして、5行目以下に貼り付ける 細かく説明しているため長くなりましたが、実際の作業はあまり面倒なものではないと思います。 それに、Sheet3はそのまま何度でも使いまわす事が出来ますから、2回目以降の作業は、基本的にSheet1の4行目のみの入力と、[コピー]&[形式を選択して貼り付け]で値のみコピーだけとなります。
- imogasi
- ベストアンサー率27% (4737/17069)
ここへ質問する前に、マクロの記録を採って勉強しましたか。煩雑な作業を回答者にやってくれと丸投げしている。 マクロに記録で、1単位作業を(=シート2の1行分)マクロの記録を取り、考えること (1)まず3つのシートを扱う準備 Dim sh1, sh2, sh3 Set sh1 = Worksheets("Sheet1") ・・・ (2)シート1が、4-8行の固定なら何も難しい点が無い。 sh1.Range("A4:C8") ここの中でシート2の各行の語句で置換。その後シート3に貼り付け (3)シート2の各行分について単位作業を繰返す シート2の最終行(=全作業の終わり)は例えば Sub test01() d2 = Worksheets("Sheet2").Range("A65536").End(xlUp).Row ' d2=sh2.Range("A65536").End(xlUp).Row (1)を済ませた場合はこれ MsgBox d2 For i = 2 To d2 '処理 Next i End Sub ーーー (4)置換はマクロ操作で,どういうコードになるか分かる。 青葉区ー>緑区 緑区ー>○○区 のような順次置換になるだろう。 それか、A4:C8を原本部分と考えて、別セル範囲へ毎回コピーし、そこで置換(青葉区固定ーー>XX)して、シート3にコピー貼り付けも良い。 (5)コピー貼り付けは、(Paste方式は避け他方が良いが) Sub test03() Set sh1 = Worksheets("Sheet1") Set sh3 = Worksheets("Sheet3") 'Sheet1置換後(コード略) d3 = sh3.Range("A65536").End(xlUp).Row+1 sh1.Range("A4:C8").Copy sh3.Cells(d3, "A") End Sub 順次シート3で下方向に累積していく 各単位作業ごとに、シート3で1行とかあけるのかどうか、質問ではっきりしない。あけるならその手当てをする。d3の+1を調節する。
- keithin
- ベストアンサー率66% (5278/7941)
シート1のB4に =INDEX(Sheet2!$A:$A,ROW(B5)/5)&"" と記入し,C4にコピー B4:C4をひたすら下向けにコピー。 A4に =IF(B4="","","神奈川") と記入し,ひたすら下向けにコピー。
- mshr1962
- ベストアンサー率39% (7417/18945)
一例ですが Sub LCOPY() Dim RG As Range X = 4 For Each RG In Worksheets("シート2").RANGE("A1:A1500") If RG Is Null Then Exit Sub For i = 1 to 5 Cells(X,1) = "神奈川県" Cells(X,2) = RG Cells(X,3) = RG X = X + 1 Next i Next RG End Sub
お礼
ありがとうございます!おかげさまで色々間に合いました! 本当にありがとうございます!