• 締切済み

VBAを使用した表の転記

VBA超初心者です。表を新たな別ブックのシートに転記した上、「商品名~住所」単位で行の下に一行追加した上で「商品名2~住所2」単位でセルを上のセルより切り取って貼り付け、セルにデータのないときは飛ばしてデータのあるセルに同じ処理をしたいと考えております。 よい方法があれば教えていただけますか。

みんなの回答

  • kkkkkm
  • ベストアンサー率65% (1638/2485)
回答No.6

新規ブックを現在のブック名の頭に「New_」を付けて現在のブックと同じフォルダにxlsxファイルとして保存して利用します。 ワンブロック7列なので毎回7列一度に転記しています。 元のシート名はSheet1にしてますから適宜変更してください。2か所あります。 Sub Test() Dim i As Long, j As Long, BlockCount As Long Dim FirstRow As Long, LastRow As Long, Ws2LastRow As Long, tmp As Long Dim Wb As Workbook Dim Ws1 As Worksheet, Ws2 As Worksheet ThisWorkbook.Sheets("Sheet1").Copy ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & _ "\New_" & Left(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, ".")) & "xlsx" Set Wb = ActiveWorkbook Set Ws2 = Wb.Worksheets.Add Ws2.Name = "転記後" Set Ws1 = Wb.Sheets("Sheet1") FirstRow = 2 LastRow = 1 BlockCount = 7 ''完全に空白の行が途中に無い場合 ''たとえば質問の画像で2行目にデータが全然無いなどが無い場合こちらを有効に 'LastRow = Ws1.Range("A1").CurrentRegion(Ws1.Range("A1").CurrentRegion.Count).Row '完全に空白の行が途中にある可能性が存在する場合 現在の処理 For i = Columns("A:A").Column To Columns("U:U").Column tmp = Ws1.Cells(Rows.Count, i).End(xlUp).Row If tmp > LastRow Then LastRow = tmp End If Next Ws2LastRow = 1 For j = FirstRow To LastRow For i = Columns("A:A").Column To Columns("U:U").Column Step BlockCount Ws2.Cells(Ws2LastRow, "A").Resize(1, BlockCount).Value = Ws1.Cells(j, i).Resize(1, BlockCount).Value Ws2LastRow = Ws2LastRow + 1 Next Next Wb.Save End Sub

NordOst
質問者

お礼

本当に助かりました。ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
回答No.5

質問者さんがVBA初心者の方ということですので for文を何度も入れ子(ネスト)にするものではなく シンプルなものにしてみました 'Sheet1にコード記述 Sub testCode() '読み込み開始行 Dim rRow As Integer: rRow = 2 '書き込み開始行 Dim wRow As Integer: wRow = 20 '商品データ読込回数 Dim kaisuu As Integer: kaisuu = 3 '指定回数繰り返し For i = 0 To kaisuu - 1 '商品名1の転記処理 Range(Cells(wRow, 1), Cells(wRow, 7)) = Range(Cells(rRow, 1), Cells(rRow, 7)).Value '商品名2の転記処理 Range(Cells(wRow + 1, 1), Cells(wRow + 1, 7)) = Range(Cells(rRow, 8), Cells(rRow, 14)).Value '商品名3の転記処理 Range(Cells(wRow + 2, 1), Cells(wRow + 2, 7)) = Range(Cells(rRow, 15), Cells(rRow, 21)).Value rRow = rRow + 1: wRow = wRow + 3 Next End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

この質問は、「表の組み換え}というタイプの課題だ。 関数でも複雑になり、操作でも、エクセルでは、良いものが備わってない。エクセルの盲点かと思う。 だからVBAでやりたくなる。 ーー 質問のデータ例の第1行目の商品名1,2,3にあたる数は3商品以下なのか? こういう制約数を質問に明記するのが、回答を簡単にし、かつ即応用できる回答になるポイントだ。 ーー 初歩的なロジックに徹するため、 ・各行について、全行総当たりするので、行ポインターを i とする。 ・完成形のシートは別シートに作る方がよい。すると、データを指定するセルが、大きく分けて、別シートの2か所になる。 このVBAでの指定する記法は、シート名+セル番地という書き方になる。コードでは、+はドットで区切る。 別ブックにアウトプットは指定はWEBで照会してください。 Shheet2のアウトプットの行ポインターは k とする。 ーー 列的には、7列使って、1商品データを模擬方向に並べているので、列数的に、Fot NextのStep 7 For j=1 to 50 Step 7 という飛び飛びの繰り返しを使う。 その7列x整数倍目が、空白ならその行のデータ終りだ、とみなす。 ==== Sub test01() 最終行番号=100 ' テスト時は5ぐらいにして、適宜変えること For i = 2 To  最終行番号 If Worksheets("Sheet1").Cells(i, 1) = "" Then GoTo p2 'その行のA冽空白かあああああ・ For j = 1 To 50 Step 7 If Worksheets("Sheet1").Cells(i, j) = "" Then GoTo p1 MsgBox Cells(i, j) Next j p1: Next i p2: End Sub で商品名を捉えているかテストする。 ーー 次にSheet2を考えて。このSheet1のデータを持って行く先のシートの行番号をk(役割的には、ポインター)で管理する。 lで1製品7セルある列を指し示す。 ===== 標準モジュールに Sub test01() k = 2 For i = 2 To 3 If Worksheets("Sheet1").Cells(i, 1) = "" Then GoTo p2 'その行のA冽空白か For j = 1 To 50 Step 7 If Worksheets("Sheet1").Cells(i, j) = "" Then GoTo p1 MsgBox Worksheets("Sheet1").Cells(i, j) '--- For l = 1 To 7 Worksheets("Sheet2").Cells(k, l) = Worksheets("Sheet1").Cells(i, j + l - 1) Next l k = k + 1 '-- Next j p1: Next i p2: End Sub === VBAのベテランには笑われますが、 ワザと、変数定義などは省略してある。 Goto文も避けるのが普通だが、あえて使用した。 最終行番号のVBAでの取得も省略した。WEBで「VBA データ最終行番号」照会のこと。 ーーー For Nextの応用は非常に広いです。シートのセルを対象にするVBAでは、これから使い始めてはどうか。

全文を見る
すると、全ての回答が全文表示されます。
  • SI299792
  • ベストアンサー率48% (723/1498)
回答No.3

関数でも可能です。3列限定ですが数式を変更すればもっと多い列でもできます。 VBA の方がよければ無視して下さい。 上画像:Sheet1とします。 下画像:Sheet2とします。 H1: =IF(INDEX(Sheet1!A:O,ROW(H3)/3+1,MOD(ROW(H3),3)*7+1)<>"",ROW()-1) 下へコピペ。ワークエリアです。空白を含めたデータ件数分必要です(画像の場合9行以下迄)。目障りなら非表示にして下さい。 A2: =IFERROR(INDEX(Sheet1!A:O,SMALL($H:$H,ROW()-1)/3+2,MOD(SMALL($H:$H,ROW()-1),3)*7+1),"") 右下へコピペ。

全文を見る
すると、全ての回答が全文表示されます。
  • HohoPapa
  • ベストアンサー率65% (454/692)
回答No.2

転記元が1シート目、転記先シートが2シート目なら 後記コードでいかがでしょうか? Sub sample()  Const GetSRow = 2 '元データの開始行番号  Const GetERow = 4 '元データの終了行番号  Dim ShGet As Worksheet  Dim ShPut As Worksheet  Dim i As Long  Dim j As Long  Dim r As Long  Dim PutR As Long    Set ShGet = ThisWorkbook.Sheets(1)  Set ShPut = ThisWorkbook.Sheets(2)    PutR = 0  For r = GetSRow To GetERow   For i = 0 To 2    PutR = PutR + 1    For j = 1 To 7     ShPut.Cells(PutR, j).Value = _      ShGet.Cells(r, i * 7 + j).Value    Next j   Next i  Next r End Sub

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

要件は ・決まった行数のデータが、決まった列数あり。  現状、ひとかたまり単位で横方向に並んでいる。 ・これをそのデータ単位で縦方向に並べ替えたい。 ということでしょうか? データの行数プラス1のセルにデータの列数プラス1の内容を 切り取って貼り付けるだけで出来ると思いますが、 詳細が不明ですのでコードを書くことは出来ません。

NordOst
質問者

補足

説明不足で申し訳ございません、その認識で合っています。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBAとデータの転記について

    今エクセル2003で、以下の上段画像のようなエクセルデータを作成しました。 上段(シート1)が、各商品に対する評価表なのですが、 そこに評価のあった件数が入力されています。 今、シート1の商品名から評価の不可までを、 VBAでシート2に以下のように転記をしたいのです。 先月はたまたま26件だったのですが、 毎月の商品の件数が、決まっていないので、連番記載とセルごとの処理 ループの使い方がよくわかりません。 評価欄は1件でも件数があれば、○印を転記して、空白はそのままで 転記したいのです。 データが多くなるにつれ手作業が大変になってきました。 VBAがまったくわからず、申し訳ありませんが よろしくお願いします。

  • Excel VBA データの転記

    Excel2003を使用しています。 Sheet1のB1セルとSheet2のB1セルのデータが一致したら、Sheet2のB1セル~E1セルのデータをSheet1のF1セル~Iセルに転記するというコードを書いています。 Sheet1のデータ最終行を取得して、上記の条件を満たさなかったSheet2のB1セル~E1セルのデータをSheet1のデータ最終行の1行下から順に転記するという内容を追加したいのですが、転記先の指定の仕方が悪いのか、希望通りになりません。 どなたか一例を示していただけないでしょうか? スマホからの投稿で、実際に書いているコードを記載できず、分かりづらくて申し訳ないのですが、よろしくお願いします。

  • VBAでのデータ転記処理

    下記の処理をVBAで作成したいのですが…。 Book "aaa" の "Sheet1" A |B |C |D |E |F |G |H |I |J |K 1 あ|い|う|え|お|か|き|く|け|こ|さ 2 た|ち|つ|て|と|な|に|ぬ|ね|の|は|ひ|ふ|へ 3 ま|み|む|め|も|や|ゆ|よ これをBook "bbb" の "Sheet1" に A|B|C|D|E 1 あ|い|う|え|お 2 か|き|く 3 け|こ|さ 4 5 た|ち|つ|て|と 6 な|に|ぬ 7 ね|の|は 8 ひ|ふ|へ 9 10 ま|み|む|め|も 11 や|ゆ|よ と言う風にデータを転記したいのです。 Book "aaa" の Sheet "Sheet1"のA~E列までは必ずデータが入っていますが F列以降は、データがある場合と無い場合があり データがなければ、そこのセル(行)は詰める。 さらに、Book "aaa" の1行を1セットとして、Book "bbb" で1セット単位で、空白行を設けたいのです。 上記例のように、1セットの行数は固定ではありません。 Book "aaa" の Sheet "Sheet1"のデータ行数は大量に(1000行以上)あります。 わかりにくいと思いますが、どなたかよろしく御願いします。

  • エクセルの特定セルを別へのブックに行方向に転記

    エクセル2010で、専用フォルダーに入っている複数のエクセルファイルの特定のセル(A1,B2,C3等)を別のブック(まとめ)に行方向に転記したいのですが。 まとめ用のシートの上の行から順に各シートのセル内容を転記していきたいのですが何か方法がありませんでしょうか? 例えば各ファイルに住所、TEL No、名前が決まった書式のセルに入っていて、これが毎月新規データとして追加されるのですが、別のエクセルシートに必要な項目のみ転記して、一覧表を作成したいのです。 現在は、1つずつファイルを開いて、目的のセルのコピペでまとめのシートに貼り付けて作業していますので、これより少しでも簡単な方法があれば教えてください。

  • 急!!Excel VBA 転記マクロを教えて下さい

    Excel VBA超初心者です、 急ぎ作らなければならない資料があり、ご助力願います。 次の様な転記するアクションをコマンドボタンに設定したいです。 Sheet1の列A(先頭セルA2)に入力したデータを、 追加した(入力間違い等を除き、保存した)データ分だけ Sheet2の列B(先頭セルB3)の最終行から転記させていく。 列Aに入力したデータは、並び替えをするので (この分は、今回のVBAに含みません。入力・転記後、Sheet1で普通に並び替えをします。) 列Aと列Bのデータの順番が異なる。 以上です。 どうぞ宜しくお願いします。

  • Excelの複数Bookでの転記と行移動処理

    Excel2003を使っています。 質問内容のシナリオは以下です。 1)Book1-Sheet1の行単位データをBook2-Sheet1に転記させる。 2)Book2-Sheet1ではデータの入っていない最終行に1)のデータが入る。 3)2)が終わると自動的に次の行に移動する 4)1)~3)を繰り返す(複数あるため) これの2)と3)のVBAをどちらのBookにどのように記載するのかがよくわかりません。 現在はBook1とBook2をどちらも開き、Book1でマクロをで転記しています。 Book2では転記される行を選択し、 次のデータのために手動で(転記された次の)1行を選択しております。

  • エクセルVBAでVLookupを使って値を転記する

    エクセル2003で商品の一覧表を作成しています。 Sheet1は商品一覧(左図) Sheet2は価格表(右図)となっています。 マクロを使用して、Sheet1のB列に価格表のデータを転記させたいと考えています。 VLookupになるのかと思い、自分でいろいろとやってみたのですが、 どうしても動作せず、挫折してしまいました。 商品一覧の最後の行までいって、空白セルがくると止まるというのが、 難しくてできませんでした。 どうかお願いいたします。

  • EXCELの「住所一覧表」のデータを個人カードに転記する方法

    xp、OFFICE2003です。教えてください。 EXCELのシート1上に1行1レコードのリストを作り、「住所録一覧表」としました。次に、シート2の上に「個人カード」というカード形式の表を作りました。この個人カードに、「一覧表」のデータを転記するようにしたいのです。この際、「一覧表」で選択した人のデータ行を転記したいのです。ちょうど、「筆まめ」の「住所録」から個人名の「宛名面」を表示するような感じです。よろしくお願いします。

  • VBA 別BOOKへのデータ転記について

    VBA初心者です。 以下のことがしたいのですが、 コードをご教示いただきたくお願いいたします。 BOOKが5つあります。 BOOK1:抽出用(Sheet2に日々の受注データを入れています)        BOOK2:転記100用 BOOK3:転記200用 BOOK4:転記300_400_500用 BOOK5:工事番号用 BOOK1:抽出用はA列からQ列まで工事番号ごとに2行目から受注データが入っています。 抽出用のsheet2のA列に「1」と入力することで転記したいデータだというフラグにし、 抽出用O列のコード100,200,300,400,500(工事の種類のようなものです)を見て、 該当のBOOK2から4にその工事番号が転記がされているか? (されていれば登録済みのメッセージ表示) 転記がされていなければ新規に登録、 新規登録の際に、抽出用Sheet2のD列の工事番号、I列の件名、K列の数量を表示して、 このデータを新規登録しますか?のようなメッセージを出し、Yesなら新規登録。 さらに、新規に登録した際にはその工事番号を名前とするBOOK5を新規作成、 BOOK5にも抽出用の受注内容を転記。 BOOK2から4に転記された工事番号をクリックすると その工事番号のBOOK5にジャンプするようにしたいのです。 抽出用A2とA4に「1」と入力された場合(O列は共に200) BOOK1抽出用データの転記したいセル番地  →  BOOK3転記200用のセル番地 A2のデータ D2 → A7 K2 → A8 C2 → A9 H2 → A10 I2 → A11 F2 → D7 L2 → D8 M2 → D9 J2 → D10 C2 → I5 Q2 → J5 A4のデータ D4 → A12 K4 → A13 C4 → A14 H4 → A15 I4 → A16 F4 → D12 L4 → D13 M4 → D14 J4 → D15 C4 → I10 Q4 → J10 BOOK2から4は1つの工事番号を5行使用して表わしています。 ですので、1つの工事番号が7から11の行、 2つ目の工事番号が12から16行目となり、それぞれ100件分の工事番号を入れられるように 作成してあります。 またBOOK5については、(A2のデータの場合)以下のように転記し、ファイル名を抽出用D2の工事番号にしたいです。 A2のデータ D2 → A3 K2 → A4 C2 → A5 H2 → A6 I2 → A7 F2 → F3 L2 → E4 M2 → E5 J2 → E6 大変長くなってしまいましたが、以上のようなことをしたいと考えておりますが、 当方、VBA初心者でして参考書とネットを駆使して抽出用のVBA(CSVデータをコピーして加工する)ことにすら大苦戦しております。 なんとかお力を貸していただけないでしょうか? ご教示よろしくお願いいたします。

  • EXCELの表からの「抽出」、「転記」

    1.元帳(Sheet8)から転記した「金融機関向け提出資料」(Sheet10)があったので、こ れからまた転記して組単位で「No.」と「氏名」の表(Sheet5)を作りたいので  す。 2. 添付画像「金融機関向け提出資料」(Sheet10)において、9組を例にとると、No.7、No.16、No.17、No.23の、以下続  く。これ等をSheet5の表に抽出していきたいのです。Sheet5の構想は、1行目:組 番号、2行目は項目名:No.(A2)と氏名(B2)、3行目~27行目(25名分)に各  データを 抽出、転記する。一組分の範囲はA1:B27です。 3.組の数は9組ありますが、一組だけその方法を教えて頂ければ結構です。 4.尚、Sheet10のNo.は1~188です。Sheet10のG列に、組番号を転記しています。こ の組番号はSheet10では印刷領域外です。 5. Sheet10からSheet 5に抽出し、転記した最初の人の(1)No.と(2)氏名をオートフィ ルで下にコピーすると、同じ組のNo.と氏名が表示されたら良いのですが・・・。 6.私はマクロが使えません。INDEX関数やMATCH関数は使ったことがあります。 元帳(Sheet8)からINDEX関数で「金融機関向け提出資料」(Sheet10)に転記して います。 7.最初から9組分の表を作成しておいて、そこにデータを順次転記していく方法もあ るのかも知れません。 8.Sheet10の一部を「画像添付」します。 以上ですが、よろしくご指導ください。

ミシンがガコンガコンする
このQ&Aのポイント
  • CPV7205というミシンが布を挟んで縫うとガコンガコンするトラブルで困っています。
  • ネジを外して掃除したが、問題が解決しない状況です。
  • ブラザー製品に関する質問です。
回答を見る

専門家に質問してみよう