質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

3092閲覧

VBA オートフィルターと条件分岐による転記

jabe

総合スコア43

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/03/20 08:37

前提・実現したいこと

リスト表シート Aパターン列(セルA7以降)の"○"印になっているコード名(セルD7以降)を、リストAパターンシートのセルH16以降へ転記させたいです。
<条件>
リストAパターンシートは、セルH16〜H36とH54〜H74の2つに転記先があります。
条件式で、リスト表シート"○"印が21個以下ならセルH16〜H36へ転記させ、
リスト表シート"○"印が22個以上ならセルH16〜H36とH54〜H74へ転記させたいです。

イメージ説明

該当ソースコード

VBA

1Sub 転記() 2Dim list As Worksheet 'リスト表 宣言 3Dim listA As Worksheet 'リストAパターン 宣言 4Dim listB As Worksheet 'リストBパターン 宣言 5Dim code As Integer 'コード 宣言 6Dim name As Integer '名称 宣言 7Dim A As Range 'Aパターン 宣言 8Dim B As Range 'Bパターン 宣言 9Dim kazuA As Integer 'リスト表○印の行数 10Dim Alline As Integer 'リスト表のA列最終行 11Dim Blline As Integer 'リスト表のB列最終行 12 13Set list = Worksheets("リスト表") 14Set listA = Worksheets("リストAパターン") 15Set listB = Worksheets("リストAパターン") 16 17list.Range("A6").AutoFilter field:=1, Criteria1:="○" 18'オートフィルタでA列を○でソート 19kazuA = list.Range(Range("A7"), Cells(Rows.Count, 1).End(xlUp)) _ 20.SpecialCells(xlCellTypeVisible).Count 21'○印の行数をカウント 22 23If kazuA <= 21 Then 24'○印の数が21以下なら以下処理 25listA.Range("H17:H36").Value = list.Range("D7:D27").Value 26'listの○印のコードをlistAのH17からH36へ転記 27Else 28'22以上なら以下処理 29listA.Range("H17:H36").Value = list.Range("D7:D27").Value 30'listの○印のコードをlistAのH17からH36へ転記 31listA.Range("H54:H74").Value = list.Range("D54:D74").Value 32'listの○印のコードをlistAのH54からH74へ転記 33 34End If 35 36list.ShowAllData 37'オートフィルタ解除 38 39End Sub

試したこと

リスト表シートからオートフィルターで"○"印の数はカウント出来たのですが、リストAパターンへ転記する際に
<前提・実現したい事>で記載してある条件式が機能せず、転記された為、
どのようなコードを書けば、達成できるのか教えていただけないでしょうか?

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

コピー元が飛び飛びだと、「一括で」っていうのは難しいです。
表を並び替えて、固めてからコピペするか、
作業用のシートに一旦抽出してから、
コピペする方が簡単かな。
あとは個々にコピペするか。

サンプルコードが必要ですか?


追記

セルを順次個々にみて転記していくサンプルです。

ExcelVBA

1Sub test_A() 2 Dim rngCopyFrom As Range '複写元セル範囲 3 Dim rngCopyTo As Range '貼付先セル範囲 4 Dim c As Range '各セル 5 Dim ixRow As Long '行の番号(相対位置) 6 Dim ixArea As Long '矩形の番号 7 8 '前提条件の定義 9 With Worksheets("リスト表").Range("A6").CurrentRegion 10 Set rngCopyFrom = Intersect(.Cells, .Offset(1)) 11 End With 12 Set rngCopyTo = Worksheets("リストAパターン").Range("H16:H36,H54:H74") 13 14 ixArea = 1 'コピー先矩形の番号(初期値) 15 '1列目の各セルを順次見て行く 16 For Each c In rngCopyFrom.Columns(1).Cells 17 'もし、今見ているセルが〇なら、 18 If c.Value = "○" Then 19 ixRow = ixRow + 1 '次の貼付先行番号の用意 20 'もし、貼り付け先行番号が21を越えたら、変数を次の矩形用に初期化 21 If ixRow > 21 Then 22 ixArea = ixArea + 1 23 ixRow = 1 24 End If 25 '見ているセルの3列右を貼り付け先のixArea番目の矩形のixRow番目の行にコピペ 26 c.Offset(, 3).Copy rngCopyTo.Areas(ixArea).Cells(ixRow, 1) 27 End If 28 Next 29End Sub

操作対象はセルなので、変数はRange型を用意しておけば、
ワークシート用の変数は必要ないです。
1回変数に、「ここのシートの、このセル範囲」と入れておけば、
どこのシートに所属しているか、情報を持っています。

あと、並び替えを使った例や、オートフィルターを使った例もサンプル書きますか?
もう、おなかいっぱいですか?
並び替えを使ったら処理速度が速いと思いますが、
行数が知れているので、体感で違いが解らないかもしれませんね。

あ、値のみ転記でしたね。
それくらいの変更は、ご自分でチャレンジしていただきたいかな。
勉強なので。

投稿2020/03/20 09:01

編集2020/03/21 09:21
mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jabe

2020/03/20 12:04

早速の回答ありがとうございます。 はい、お手数お掛けしますがサンプルコードをいただきたいです。
jabe

2020/03/21 14:24

サンプルコードありがとうございます。 CurrentRegion、Intersect、ixAreaと初めて見るコードでお腹いっぱいになりました。動作したところ目的通り動きました。頂いたコードで勉強します。 その中で質問なのですが、転記先のリストAパターンシートH16〜H36のセルですが、 H16〜N16を1つセル(結合状態)とした場合に、コピペコードで"実行時エラー1004:この操作は結合したセルには行えません"とエラーが出てしまったのですが、こちらはどのようにしたら解決できるのか教えてください。
mattuwan

2020/03/21 16:26

valueプロパティを、使って値を渡してください。
jabe

2020/03/22 06:44

アドバイスありがとうございます。 はい、頑張ってみます。
jabe

2020/03/22 06:57

”あ、値のみ転記でしたね。”の値のみとはどういう意味でしょうか? 頂いたコードを実行したところ転記出来ていたのでどういう意味か分からなくて。
mattuwan

2020/03/22 07:31

「セル」という存在は、値だけを保管してるのではなくフォントや塗りつぶしの色、罫線の有無等、様々な情報により構成されています。 なので、単純にコピペすると、それら全部が複写されます。なので、結合セルに張り付けようとすると、エラーになったり、結合が崩れたりします。 valueプロパティは、そのさまざまな情報の内の「値」の項目ですので、valueプロパティだけを指定して値を渡すようにすると、その他の項目には影響しません。 詳しくは、明日以降にさせてください。パソコンがない環境なので。
jabe

2020/03/22 07:52

説明ありがとうございます。 コピペとvalueの違いが分かりました。 コードを以下のように変更したら動作しました。 rngCopyTo.Areas(ixArea).Cells(ixRow, 1).Value = c.Offset(, 3).Value
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問