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

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

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

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

945閲覧

連続したデータを1行づつ離して貼り付け

koko2

総合スコア21

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2020/05/06 06:01

編集2020/06/06 01:15
Sub Sample() Dim i As Integer Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") Dim DatePart As Integer Dim ColRead As String Dim rowsData As Long rowsData = ws1.Range("A2").End(xlDown).Row - 1 For i = 2 To rowsData ColRead = ws1.Cells(i, "E") If ColRead = "AA" Or "BB" Then ws1.(Cells(i, "A"),Cells(i, "B"),Cells(i, "C"), Cells(i + 1, "D")).Copy ws2.Cells(i, 2).PasteSpecial Paste:=xlPasteValues Else: ColRead = "CC" ws1.Rows(i).Copy ws2.Rows(i).PasteSpecial Paste:=xlPasteValues End If Next End Sub

<エラー箇所>
と作成しましたが
If ColRead = "AA" Or "BB" Then
ws1.(Cells(i, "A"),Cells(i, "B"),Cells(i, "C"), Cells(i + 1, "D")).Copy
ws2.Cells(i, 2).PasteSpecial Paste:=xlPasteValues

の記載が間違っているようなのですが自分ではよくわかりませんでした。

<やりたいこと>
①Sheet1にデータがあり、E列に条件として、今のところ順番は「AA」「BB」「CC」の3つの順番が入っています。E列にAA,BBが入力されている場合、C列のAA列を・D列はBB列をコピーしsheet2へ貼り付けて一覧にしたいです。
②さらにE列にCCが入力されている場合、AからD列をコピーし貼り付け
③上から順に繰り返す
④毎回列の数は変わります

どのようにしたらうまく行くのかご教示頂けないでしょうか、よろしくお願いします

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

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

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

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

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

meg_

2020/05/06 06:28 編集

「AA」「BB」「CC」は必ずこの順番で1回ずつ順に現れるのですか?
meg_

2020/05/06 06:30

「セルデータを読み込んでくれません 」とはどういう意味ですか?
koko2

2020/05/06 06:41

ご連絡ありがとうございます。今のところ順番は「AA」「BB」「CC」の3つの順番です。「セルデータを読み込んでくれません 」とは、自分で作成してみて、データ一覧が上記でできると思ったのですが、IF関数の使い方や繰り返し処理がうまく書けていないようで、If ColRead = "AA" Or "BB" Then以降で苦戦しています。すみませんがよろしくお願いいたします。
guest

回答2

0

ベストアンサー

あなたのソースを極力いかすようにして、修正しました。
以下のようにしてください。
変数i等はLong型で確保するようにしてください。
Intgerだと-32768~32767の範囲しか保持できません。32767行を超えると動作がおかしくなります。

VBA

1Sub Sample() 2 Dim i As Long 3 Dim j As Long 4 Dim ws1 As Worksheet 5 Dim ws2 As Worksheet 6 Set ws1 = Worksheets("Sheet1") 7 Set ws2 = Worksheets("Sheet2") 8 9 Dim DatePart As Integer 10 Dim ColRead As String 11 12 Dim rowsData As Long 13 rowsData = ws1.Range("A2").End(xlDown).row 14 j = 2 15 For i = 2 To rowsData 16 17 ColRead = ws1.Cells(i, "E").Value 18 19 If ColRead = "AA" Then 20 ws2.Cells(j, "A").Value = ws1.Cells(i, "A").Value '商品設定 21 ws2.Cells(j, "B").Value = ws1.Cells(i, "B").Value 'size設定 22 ws2.Cells(j, "C").Value = ws1.Cells(i, "C").Value '単価1設定 23 End If 24 If ColRead = "BB" Then 25 ws2.Cells(j, "D").Value = ws1.Cells(i, "D").Value '単価2設定 26 j = j + 1 'Sheet2の次の行設定 27 End If 28 If ColRead = "CC" Then 29 ws2.Cells(j, "A").Value = ws1.Cells(i, "A").Value '商品設定 30 ws2.Cells(j, "B").Value = ws1.Cells(i, "B").Value 'size設定 31 ws2.Cells(j, "C").Value = ws1.Cells(i, "C").Value '単価1設定 32 ws2.Cells(j, "D").Value = ws1.Cells(i, "D").Value '単価2設定 33 j = j + 1 'Sheet2の次の行設定 34 End If 35 Next 36End Sub 37

投稿2020/05/06 10:44

tatsu99

総合スコア5493

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

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

koko2

2020/05/06 11:39

出来ました! こういう風にすればいいんですね 本当に助かりました。ありがとうございます。
guest

0

エラーは下記でなくなるかと思います

VBA

1If ColRead = "AA" Or ColRead ="BB" Then

但し、「AA」のときと「BB」のときとでその後の処理が変わるので上記でエラーがなくなっても希望通りのマクロにはならないでしょう。
「AA」のときと「BB」のときでそれぞれIf文を書くべきかと思います。

投稿2020/05/06 07:11

編集2020/05/06 07:14
meg_

総合スコア10760

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

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

koko2

2020/05/06 09:17

回答ありがとうございました。私の説明が悪くて申し訳ありません。 ws1.(Cells(i, "A"),Cells(i, "B"),Cells(i, "C"), Cells(i + 1, "D")).Copy ws2.Cells(i, 2).PasteSpecial Paste:=xlPasteValues ここが不明点なのですが、おそらくご説明頂いたように、「AA」のときと「BB」のときと書くべきですね。がんばってみます。
meg_

2020/05/06 09:22

確認ですが「If ColRead = "AA" Or "BB" Then」のところでエラーは出ていない、という理解で良いですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問