• ベストアンサー

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行以上)あります。 わかりにくいと思いますが、どなたかよろしく御願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 ちょっとまとめますと、 ** 元のブック(aaa.xls)のSheet1 の1行ごとのデータを、セルの間をおかずに、 別のブック(bbb.xls)のSheet1 に、A1から順に 最初の行に-5セル 次の行以降は-3セルずつ 元のシートの行が変わるときには、1行間を空けて 元のブックの行順に繰り返し、コピーする。 ** ということになるのでしょうか? 一応、ブックは既に両方とも開いているものとします。最初、少量のサンプルからお試しください。 '<標準モジュール> Sub Sample()  Dim i As Long, j As Long, m As Long, n As Long 'ソース側  Application.Goto Workbooks("aaa.xls"). _  Worksheets("Sheet1").Range("A1")  'コピー側  With Workbooks("bbb.xls").Worksheets("Sheet1")   Application.ScreenUpdating = False   n = 1: m = 1   For i = 1 To Cells(65536, 1).End(xlUp).Row    For j = 1 To Cells(i, 256).End(xlToLeft).Column     If Not IsEmpty(Cells(i, j)) Then      If j < 6 Then       .Cells(n, m).Value = Cells(i, j).Value       m = m + 1       Else       If m >= 3 Then        n = n + 1: m = 1        Else        m = m + 1       End If       .Cells(n, m).Value = Cells(i, j).Value      End If     End If    Next j    n = n + 2: m = 1   Next i   Application.ScreenUpdating = True  End With End Sub

fk_sap
質問者

補足

Wendy02さん!素早く、しかも的確なご回答ありがとうございました! 実際の項目数にアレンジし直して使用させて頂きましたが、ビックリするくらいスッキリ仕上がりました。 いとも簡単にこんなコードを書いてしまわれるのには、感服致します。(私が知らなさすぎ?!) この上、欲張りを言って申し訳ないのですが コピー側の2行目(元データの6項目以降)の貼り付け位置を下記のようにすることは可能でしょうか? | A |B |C |D |E |F|G|H 1|あ|い|う|え|お 2| | | |か| |き| |く 2行目以降はD列から貼り付け、且つ1セルずつあける。 教えて頂いた Else  If m >= 3 Then    n = n + 1: m = 1 の「m=1」を「m=4」に変えてみたりしたのですが そうすると、「か」「き」「く」が「D1」「D2」「D3」に入ってしまいました。 (^_^!) ド素人で申し訳ありません。 もしお時間よろしければ、ご教授御願い致します。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

短くならないかと考えて Sub test07() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("sheet4") Set sh2 = Worksheets("sheet5") d = sh1.Range("a65536").End(xlUp).Row k = 1 For i = 1 To d '--- For j = 1 To 5 sh2.Cells(k, j) = sh1.Cells(i, j) Next j k = k + 1 '--- For m = 6 To 50 Step 3 If sh1.Cells(i, m) = "" Then k = k + 1 Exit For Else sh2.Cells(k, 1) = sh1.Cells(i, m) sh2.Cells(k, 2) = sh1.Cells(i, m + 1) sh2.Cells(k, 3) = sh1.Cells(i, m + 2) k = k + 1 End If Next m Next i End Sub 同一ブックの2シートでやって、テストの手を抜いてます。 他のご回答など見て修正してください。 For m = 6 To 50 Step 3の50は最右列を見積もって変えてください。 質問例ではテスト済み。

fk_sap
質問者

お礼

お返事が遅くなり、申し訳ありませんでした! 早速ご回答下さり、ありがとうございました。 皆さんに教えて頂いた物を部分的に使わせて頂いて なんとか、作成したい表にすることができました!

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 Wendy02です。 お目にとまり、ありがとうございます。 >2行目以降はD列から貼り付け、且つ1セルずつあける。 >   n = n + 1: m = 1 >の「m=1」を「m=4」に変えてみたりしたのですが 着目点は良かったのですが、増加する部分ですから、増加する数を修正しないといけないわけです。これも数列ですね。 下から9行目の 修正前  .Cells(n, m).Value = Cells(i, j).Value            ↓ 修正後:   .Cells(n, (m * 2) + 2).Value = Cells(i, j).Value とすればよいです。

fk_sap
質問者

お礼

何から何までありがとうございました。 とても役に立ちました! お礼が遅くなり、申し訳ありませんでした。

  • tona-tona
  • ベストアンサー率34% (8/23)
回答No.2

こんにちは。 VBAを半年振りに再開した初級者くらいです。 参考程度にしてください。 動作確認:Excel97 10000×5(8)の配列に入れてっているので、 出来あがる表が1万行を超えるとエラーがでます。 その辺は工夫して直して下さいね。 最初の質問のはこんな感じで。 Sub aaaとbbbを開いてから実行してね001() Dim Sh0 As Worksheet Dim Sh1 As Worksheet Dim ShName As String Dim ShName0 As String Dim I As Long Dim M As Long Dim N As Long Dim R1 As Long Dim C1 As Long Dim Arr0 As Variant Dim Arr1(1 To 10000, 1 To 5) As Variant Application.ScreenUpdating = False Set Sh0 = Workbooks("aaa.xls").Sheets("Sheet1") Set Sh1 = Workbooks("bbb.xls").Sheets("Sheet1") M = 0 Arr0 = Sh0.Cells(1).CurrentRegion.Value For R1 = 1 To UBound(Arr0, 1) N = 0 For C1 = 1 To UBound(Arr0, 2) If Arr0(R1, C1) = Empty Then Exit For Select Case C1 Case 1 To 5 If C1 = 1 Then M = M + 1 N = C1 Case Is >= 6 If (C1 Mod 3) = 0 Then M = M + 1 N = (C1 Mod 3) + 1 End Select Arr1(M, N) = Arr0(R1, C1) Next C1 M = M + 1 Next R1 Sh1.Cells(1, 1).Resize(M, 5).Value = Arr1 Erase Arr0 Erase Arr1 Application.ScreenUpdating = True End Sub 補足後はこんな感じ。 Sub aaaとbbbを開いてから実行してね002() Dim Sh0 As Worksheet Dim Sh1 As Worksheet Dim ShName As String Dim ShName0 As String Dim I As Long Dim M As Long Dim N As Long Dim R1 As Long Dim C1 As Long Dim Arr0 As Variant Dim Arr1(1 To 10000, 1 To 8) As Variant Application.ScreenUpdating = False Set Sh0 = Workbooks("aaa.xls").Sheets("Sheet1") Set Sh1 = Workbooks("bbb.xls").Sheets("Sheet1") M = 0 Arr0 = Sh0.Cells(1).CurrentRegion.Value For R1 = 1 To UBound(Arr0, 1) N = 0 For C1 = 1 To UBound(Arr0, 2) If Arr0(R1, C1) = Empty Then Exit For Select Case C1 Case 1 To 5 If C1 = 1 Then M = M + 1 N = C1 Case Is >= 6 If (C1 Mod 3) = 0 Then M = M + 1 N = 4 + (C1 Mod 3) * 2 'ここを変更 End Select Arr1(M, N) = Arr0(R1, C1) Next C1 M = M + 1 Next R1 Sh1.Cells(1, 1).Resize(M, 8).Value = Arr1 'ここを変更 Erase Arr0 Erase Arr1 Application.ScreenUpdating = True End Sub

fk_sap
質問者

お礼

お返事が遅くなり、申し訳ありませんでした! 早速ご回答下さり、ありがとうございました。 皆さんに教えて頂いた物を部分的に使わせて頂いて なんとか、作成したい表にすることができました!

関連するQ&A

  • 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 VBAでワークブックのデータ取得

    コードを実行するブックがあるホルダー内の全てのブック(10個程度)からSheet1のA列~E列のデータ(行数はブックにより異なりますが大体2000行程度)の2行目以降を取得し、コードを実行するブックのSheet("DATA")の2行目以降にデータを貼り付け、F列に取得したブック名を記載したいのです。 残念ながら最初でつまずいています。 なにとぞご教示お願いします。

  • 【VBA】シートの内容を別シートへ転記する方法

    1シート目のA列には品番が沢山並んでおり、B列、C列に内訳、D列に合計が有ります。例)参照 下記の処理をしたいです。 ------------------------------------------------------------------- 2シート目へ1行目の見出しとAAAの品番の行を転記 3シート目へ1行目の見出しとBBBの品番の行を転記 同様に、A列最終行迄繰り返しシートを作成 ------------------------------------------------------------------- A列の品番が変わる行迄を一まとまりとして行選択する方法にて コードをお教え頂きたく、宜しくお願いします。お教え頂いた内容は理解する様努めます。 例) 内訳1 内訳2 合計 AAA ○○○ ○○○ ○○○ AAA ○○○ ○○○ ○○○ BBB ○○○ ○○○ ○○○ BBB ○○○ ○○○ ○○○ CCC ○○○ ○○○ ○○○ CCC ○○○ ○○○ ○○○ DDD ○○○ ○○○ ○○○ DDD ○○○ ○○○ ○○○ DDD ○○○ ○○○ ○○○ 以下略

  • (EXCEL)重複したデーターの抽出について

    EXCEL2003 シート「sheet1」に下記のようなデーターがあります。 <sheet1>   A   B   C  D 1 りんご 青森 AAA BBB 2 みかん 愛媛 CCC DDD 3 みかん 青森 AAA BBB 4 りんご 青森 AAA BBB 5 みかん 愛媛 CCC DDD A列とB列が同じ値のものをシート「sheet2」に重複しているデーター は1行だけになり、E列にカウントした数が入力されるようにしたいです。 (C列やD列は同じ値でなくてもA列とB列が同じ値の時にカウントして抽出したいです) <sheet2>   A   B   C  D   E  りんご 青森 AAA BBB  2  みかん 愛媛 CCC DDD  2   ご教示のほどお願いします。

  • マクロで5個のBOOKのデータをBOOK1に転記

    エクセルマクロで対話型でBOOK2~6の5個のデータを BOOK1のシート1に順番で転記したいです。 BOOK2~BOOK6は作業者にファイルを選択させたいです。 BOOK2~BOOK6は作業の都度行数がBOOKごとに変わります。 (500~5,000行でばらつきます) 流れとしては、 1.BOOK1を開いてマクロを軌道 2.エクセルのファイルを開くウィンドーが出る 3.ファイルを選択させる(例:マイネットワーク内のBOOK2を選択) 4.ウィンドーの開くをクリックする 5.転記1回目   指定したファイルが開いてデータが   BOOK1のシート1に転記される   この1回目は1行目からデータがある最終行まで。   その後BOOK2は閉じられる 6.メッセージボックスで「転記完了」と表示 7.メッセージボックスの「OK」をクリックすると   エクセルのファイルを開くウィンドーが出る 8.ファイルを選択させる(例:マイネットワーク内のBOOK3を選択) 9.ウィンドーの開くをクリックする 10.転記2回目   指定したファイルが開いてデータの中の2行目~最終行までを   BOOK1のシート1の最終行の次の行から転記を行う。   (NO.5のBOOK2が1,000行の場合1,001行目から    BOOK3のデータ2行目以降が転記される)   その後BOOK3は閉じられる 11.この作業を計5回行う   (転記3~5回目も転記するデータは2行目~最終行) 13.メッセージボックスで「5個のBOOKの転記が終了」と表示 14.メッセージボックスの「OK」をクリックすると   Call 編集   でSub 編集 というプロシージャーが起動する Sub 編集は出来上がってます。 (BOOK1のシート1を編集します。) NO.1~NO.14のマクロ記述を教えてください。 自分で作成した記述では全然駄目でした。 よろしくお願いします。

  • Excel2002:複数条件のデータの個数の集計

    苦手な集計について質問させてください。 [A] [B] [1] AAA aaa [2] BBB bbb [3] AAA aaa [4] AAA bbb [5] BBB ccc 上記のようなデータで[A]と[B]のAND条件でみたときの個数を集計したいと思います。 例えば上記であれば、 [A]AAAかつ[B]aaa・・・2個 [A]BBBかつ[B]bbb・・・1個 [A]AAAかつ[B]bbb・・・1個 [A]BBBかつ[B]ccc・・・1個 になります。[B]のデータは[A]のデータに依存せず、[A]の各値にまたがっています。([B]bbbは[A]AAAと[A]BBBの場合があります) 実際のシートでは、全パターンを網羅したリストがA列とB列、集計対象がD列とE列にあります。 上記の例でいえば、以下のようになっています。 [A] [B] [C] [D] [E] [1] AAA aaa AAA aaa [2] AAA bbb BBB bbb [3] BBB bbb AAA aaa [4] BBB ccc AAA bbb [5] BBB ccc つまり[A]列と[B]列が組み合わせパターン、[D]列と[E]列が集計元データです。 ちなみにパターン数が414個、集計元データは29000個程度です。 そして最終的な各パターンの個数を[C]列に表示させたいと思います。 VLOOKUPやピボットテーブルを考えましたが、ピンと来ません。 適切なやり方を教えてください。よろしくお願いします。

  • 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行を選択しております。

  • Book間のデータ転記を自動化したい

    Book A からBook Bへ毎日データをコピーしています、これを自動化できないでしょうか? Book A      A    B    C    D 1 会社名1  data11 data12 data13 2 会社名2  data21 data22 data23 3 会社名3  data31 data32 data33 Book B     A    B    C    D 1 日付1  data11 data12 data13 2 日付2  data14 data15 data16 3 日付3  data17 data18 data19 Book A は1日につき1ファイルづつ毎日増えていきます会社数は日によって違いますが大体40~50くらですデータ数は1行につき15個で一定です。 Book B は会社ごとにシートが作ってありBook Bの中に約35シート入っています。 少し説明がわかりにくいかもしれませんが、やりたいことは毎日Book Aというファイルを渡されるのでその中から主な会社35社のデータを会社別に日付順にしたいのでBook Bへ手作業でコピーしています、毎日のことなので結構大変です自動でコピーできないでしょうか? それとも何か別の方法でもっとスマートに処理できますか?

  • エクセルVBA シート1からシート2へ転記したい

    シート1のデータはそのままで、 シート2に編集して転記したいです。 シート1にはA列からI列までデータが入っています。 行数は都度変わりますがデータは3行目から始まり 大体500行くらいです。 転記方法は シート1のD列→シート2のA列 シート1のE列→シート2のB列 シート1のF列→シート2のC列 シート1のC列→シート2のD列 でシート1のD列の値が同じ場合は 転記先のシート2の行数は増やさずにシート1のC列の値を 同じ値のF列内にカンマでつないで転記したいです。 でそのつないだ合計数をシート2のE列に表示したいです。 イメージ C  D    E     F ------------------------ A1 みかん 国内 Sサイズ A3 みかん 国内 Sサイズ D6 みかん 国内 Sサイズ D9 りんご 国内 Mサイズ G7 りんご 国内 Mサイズ F5 バナナ 海外 Lサイズ G1 バナナ 海外 Lサイズ A2 いちご 国内 Sサイズ D8 いちご 国内 Sサイズ F3 いちご 国内 Sサイズ H2 いちご 国内 Sサイズ   ↓ A    B    C      D     E ------------------------------------------- みかん 国内 Sサイズ A1,A3,D6   3←3個 りんご 国内 Mサイズ D9,G7     2←2個 バナナ 海外 Lサイズ F5,G1     2←2個 いちご 国内 Sサイズ A2,D8,F3,H2  4←4個 上記例の場合は元データは11行ですが編集後は4行です。 配列は自力で作成できないので考え方を教えていただきたいです。 構文をそのまま書いていただいても大変助かります。 Do~LoopかFor~Nextで上から順最終行まで処理で シート1からシート2へ転記する構文をかいて D列の値が直前に処理した値と同じ場合は 転記はしないでC列の値を変数1に代入し シート2の該当行のD列も変数2に代入し 変数1&","&変数2で対象行のD列に転記と考えましたが うまくできませんでした。 またシート2のE列の求め方ですが、上記変数1,2に代入した後に 変数3=変数3+1とかの文でカウントし、 その値を転記すればいいのでしょうか? すいません。今日1日頑張ってうまくできず 上手く説明できません。 よろしくお願いします。

  • 2つのBook間で共通のキーワードを使いデータを転記するには?

    下記のようなデータがある場合、Book1/sheet1のD列へ Book2/sheet1 C列のデータを転記したい。キーワードは 各Book B列のロットNO.です。どのようなマクロを 組めばいいのでしょうか? Book1/sheet1    A    B    C    D 1  品名 ロットNO. 数量 2  A   A123   25   50(転記) 3  A   A234   20   75(転記) 4  A   A345   22   60(転記) ・ Book2/sheet1    A    B    C    D 1  品名 ロットNO. 時間(HR) 2  A   A123    50 3  A   A234    75 4  A   A345    60 ・

専門家に質問してみよう