VBAでCSVファイルの縦横変換を実現する方法

このQ&Aのポイント
  • CSVファイルでC,D,E列を6行毎に別シートに貼り付ける方法をVBAで解説します。
  • A行とB行は同じですが、C,D,E行が異なるデータを、6行目のC,D,Eを1行目のT列まで置き換える方法を学びます。
  • このデータは約300行あり、毎週置き換えが必要です。VBAを使って効率的に処理する方法をご紹介します。
回答を見る
  • ベストアンサー

VBA 縦横変換

CSVファイルでC,D,E列を6行毎に別シートに貼り付けたいのですが、VBAがわからず困ってます。 A行とB行はすべて同じでC,D,E行が異なります 6行目のC,D,Eを1行目のT列まで置き換えたら 2行目で同じ事の繰り返しになります。 このデータが300行程度あり、毎週発生して置き換えが必要になります どなたか、お教え頂けますでしょうか? A B C D E 1 A(株) 田中 HE-1 ABC 伝票A 2 A(株) 田中 HE-2 DEF 伝票B 3 A(株) 田中 HE-3 GHI 伝票C 4 A(株) 田中 HE-4 JKL 伝票D 5 A(株) 田中 HE-5 MNO 伝票E 6 A(株) 田中 HE-6 PQR 伝票F ・ ・ ↓の用に置き換え A B C D E F G H J K L・・・・ 1 A(株) 田中 HE-1 ABC 伝票A HE-2 DEF 伝票B HE-3 GHI 伝票C・・・ 2 A(株) 田中 HE-7 STU 伝票G HE-8 VWX 伝票H HE-9 YZa 伝票I・・・ 説明がわかりづらくて申し訳ありません。 なにとぞよろしくお願い致します。

  • lain_
  • お礼率50% (1/2)

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

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

CSVデータはエクセルシートに読み込まれているとして、はじめる。 例データ A(株) 田中 HE-1 ABC 伝票A A(株) 田中 HE-2 DEF 伝票B A(株) 田中 HE-3 GHI 伝票C A(株) 田中 HE-4 JKL 伝票D A(株) 田中 HE-5 MNO 伝票E A(株) 田中 HE-6 PQR 伝票F A(株) 田中 HE-7 ABC2 伝票G A(株) 田中 HE-8 DEF2 伝票H A(株) 田中 HE-9 GHI2 伝票I A(株) 田中 HE-10 JKL2 伝票J A(株) 田中 HE-11 MNO2 伝票K A(株) 田中 HE-12 PQR2 伝票L A(株) 田中 HE-13 ABC3 伝票M A(株) 田中 HE-14 DEF3 伝票N A(株) 田中 HE-15 GHI3 伝票P A(株) 田中 HE-16 JKL3 伝票Q A(株) 田中 HE-17 MNO3 伝票R A(株) 田中 HE-18 PQR3 伝票S A(株) 田中 HE-19 ABC4 伝票T A(株) 田中 HE-20 DEF4 伝票U ーー コード 標準モジュールに Sub test02() Dim sh1, sh2 Set sh1 = Worksheets("Sheet1") 'Sheet1を使う。原データ Set sh2 = Worksheets("Sheet2") 'Sheet1を使う。結果データ k = 2 '結果データは2行目から j = 3 '繰り返し列の最初は3列目から d = sh1.Range("A65536").End(xlUp).Row '原データ最終行 MsgBox d For i = 2 To d '--会社と氏名 2列 If j Mod 3 = 0 Then sh2.Cells(k, "A") = sh1.Cells(i, "A") sh2.Cells(k, "B") = sh1.Cells(i, "B") End If '---繰返し部分データ 3列 sh2.Cells(k, j) = sh1.Cells(i, "C") sh2.Cells(k, j + 1) = sh1.Cells(i, "D") sh2.Cells(k, j + 2) = sh1.Cells(i, "E") j = j + 3 '次は3列右から If j > 20 Then '=3*6+2 6回分済んだら k = k + 1 '次行に書き出し j = 3 '繰り返しデータ列の最初は3列目から End If Next i End Sub ーー 結果 A(株) 田中 HE-1 ABC 伝票A HE-2 DEF 伝票B HE-3・・・ A(株) 田中 HE-7 ABC2 伝票G HE-8 DEF2 伝票H HE-9・・・ A(株) 田中 HE-13 ABC3 伝票M HE-14 DEF3 伝票N HE-15・・・ A(株) 田中 HE-19 ABC4 伝票T HE-20 DEF4 伝票U ・・・ 右の方の列は掲載省略。 ーーー ただSheet1のセルデータをSheet2の何処の列へ代入するかだけの簡単な問題。 質問者は変数 j、K のようなポインター的な使い方などが経験ないのかな。

lain_
質問者

お礼

返信遅くなり 申し訳ありません 回答ありがとうございます。 見事 できました!!! が、私の質問ミスでまだ出来上がってないんです。。 VBAはマクロ操作した物をVBEで開いて見て、書き換えて・・っていう程度しか した事がないので、変数の使い方がよくわかりません。

その他の回答 (1)

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.1

通りがかりです。 元データが Sheet1 書き換え先が Sheet2 というシートだとして Sub ボタン1_Click() GYOU = 2 RETU = 1 With Sheets("Sheet2") For i = 2 To Sheets("Sheet1").UsedRange.Rows.Count .Range(.Cells(GYOU, RETU), .Cells(GYOU, RETU + 5)).Value = Range(Cells(i, 1), Cells(i, 6)).Value RETU = RETU + 5 If RETU > 6 * 5 Then RETU = 1 GYOU = GYOU + 1 End If Next End With End Sub 一例です。

関連するQ&A

  • データをブロックごとに並べ替えるスクリプト

    データをブロックごとに移動して並べ替えたいのですが、 うまくいくスクリプトが書けず困っています。 APR_A----- abc 1 def 2 APR_B----- abc 3 def 4 APR_C----- abc 5 def 6 APR_A----- ghi 1 jkl 2 mno 3 APR_B----- ghi 4 jkl 5 mno 6 APR_C----- ghi 7 jkl 8 mno 9 のようなフォーマットのデータがあります。 これを以下のようにフォーマットを変えたいのですが、 awkを使ってどのようにスクリプトを書いたらよいでしょうか。 元データの中で、区切りの行は常にAPR_で始まっています。 APR_で始まる行に来たら次の列に移って2列目のみprint というのを繰り返し、APR_Aに戻ってきたら、 1列目(abc,defなど)、2列目ともprintして同様に繰り返す。 各ブロックの行数はまちまちです。(最初のブロックのように2行のブロックもあれば2番目のブロックのように3行のもあります) rowtitle APR_A APR_B APR_C abc 1 3 5 def 2 4 6 ghi 1 4 7 jkl 2 5 8 mno 3 6 9 分かりにくい文章ですが、理解していただけることを願っています。 よろしくお願いします。

  • Excel VBAでの固定長のテキストファイル読み込み

    こんにちは。 会社にてEXCELをちょろっとかじっていると言う理由から、あまり触ったことのないVBAを使って固定長のテキストファイルを読み込むプログラムを作るように言われてしまって困っています。 利用している固定長のテキストファイル中の各行の桁数は同一でなく、行によってまちまち。しかし、各行の始めの3ケタはヘッダになっています。 例) ABCTTTTTTTTTTTTTTTTKKKKKOOOOOOPPPPPPPPWWWWWWWWWWWWWWWWWWWWWWWSS XYZLLLLL <ABCとXYZがヘッダ。同じ文字が固定長で決まったあるデータ項目と考えて下さい> もちろん、1ファイルにはもっとたくさんの行がずらずら並んでおります。 中身自体は、ある伝票の内容なのですが、1ファイル中には複数の伝票内容(ヘッダABC~XYZで1伝票)が記されております。 なので、ヘッダで言うとABC,DEF,GHI...XYZとなってまたABC~が続く。 しかも、ある伝票では途中存在しないヘッダがあったり、同じヘッダが何回も繰り返されたりするものもあります。 (ABC,DEF,DEF,DEF,GHI..やABC,GHI,JKL..など) これをどうやってEXCELの各セルに貼り付けるかがどう頑張っても分かりません。どうすればよいのでしょうか?

  • csvファイルのデータ変換について

    OS:windows2000pro VB:VB6.0sp5 c:\data.csv(カンマ区切) のデータ(全6列)で 1列目,2列目,3列目,4列目,5列目,6列目 [変換前(全6列)] abc,a1,aあ b2,3c,4d5e (1行目) ccc,c3,aあ い,3c,4d5e (2行目) bbc,b2,あ b2a,c3,d5e4 (3行目) [変換後(全6列)] abc,a1,"aあ b2",3c,"4d5e" (1行目) ccc,c3,"aあ い",3c,"4d5e" (2行目) bbc,b2,"あ b2a",c3,"d5e4" (3行目) 上記の様に 3列,6列目を「"・・・"」ダブルコーテイションで 囲い(変換し)、c:\data_after.csvというファイル名で 保存する為のプログラムをご教示ください よろしくお願いいたします

  • 正規表現でのパイプ(or)を減らしたいのですが

    いつもお世話になっています。 正規表現のパイプ(|)は非常に遅くなるらしいので、[]内に並べるようにプログラムを修正しようと思っています。それで、 /a|b|c/ ---> [abc] のような方法は、よく紹介されているのですが、a,b,cが単独文字ではなく、単語になっているような場合、 /abc|def|ghi/ ---> [(abc)(def)(ghi)] だと多分ダメですよね(今実行環境が無く確認できません)。 それで、各々の単語を $a = 'abc'; $d = 'def'; $g = 'ghi'; のようにあらかじめ定義しておいて、 /$a|$d|$g/ ---> [$a$d$g] というように書き換えると、うまくいくのでしょうか? やり方が間違っていましたら、ご指摘いただきたく、よろしくお願いします。

    • ベストアンサー
    • Perl
  • Excelで特定列に同じ内容がある行を削除する

    下記に示しますように,A列に同じ内容がある行を削除する方法 を教えて頂けないでしょうか。 よろしくお願い致します。 _ | A B C … ―――――――――― 1 | a 1 ABC …  2 | a 2 def …  3 | a 3 ghi … 4 | a 4 JKL … 5 | b 2 QWE … 6 | b 2 asd …  7 | b 2 zxc …  8 | c 3 ASD …  9 | c 5 nmk …  10 | d 4 ZXC …  11 | d 4 tyu …  : | : : : … ↓ _ | A B C … ―――――――――― 1 | a 1 ABC …  2 | b 2 QWE … 3 | c 3 ASD … 4 | d 4 ZXC …  : | : : : …

  • CSVファイルの任意の列をダブルクォーテーションで囲みたいのですが・・・。

    CSVファイルの任意の列をダブルクォーテーションで囲みたいのですが・・・。 例えば  abc,def,ghi,jkl  mno,pqr,stu,vwx     ↓  abc,"def",ghi,"jkl"  mno,"pqr",stu,"vwx" というように、2番目と4番目の列の文字列をダブルクォーテーションで囲む、といった具合にです。 調べてみるとVBAを使用する方法はあるようですが、EXCELやその他のフリーソフト等を使用して処理する方法はありませんでしょうか。 よろしくお願いいたします。

  • エクセルで元データを残しながらコピー

    エクセル2007で複数の行にまたがってある複数のデータを楽に一つの行にまとめたい。 例 A1 abc B2 def A3 ghi C4 jkl 以下省略 このB行とC行をA行に全てまとめて移動したいのですがどのようにすればいいでしょうか。 したいこと A1 abc A2 def A3 ghi A4 jkl 以下略

  • エクセル関数:右側の文字列を抜き出す方法

    エクセル初心者です。 文字列の抜き出す方法で悩んでいます。 たとえば、A1~A5までに下のような 文字列が順に入っているとします。 C:\abc\TEST1.DOC C:\abc\def\TEST2.DOC C:\abc\def\ghi\jkl\TEST3.DOC C:\abc\def\ghi\TEST4.DOC C:\abc\def\TEST5.DOC これらの文字列の一番右側の'\'以降の文字列 (TEST1~5.DOC)を、B1~B5のセルに 出したいと思っているんですが できるのでしょうか? RIGHT関数や、LEN関数、FIND関数を使って できそうな気がするのですが どうも良い方法が思いつきません。 よろしくお願いします。

  • perlでのcsv形式のテキストファイルの変換

    perlを使用してcsv形式のテキストファイルを下記のように変換したいと思っています。 【変換前】 10, abc , def , ghi ,jkl    ----1行目 10, abc , def , aaa, bbb   ----2行目 10, abc , def , ccc , ddd  ----3行目 11, abc , def , eee , fff   ----4行目 11, abc , def , aaa , ggg ----5行目 11, zzz , def , aaa , ggg  ----6行目 12, abc , def , aaa ,ggg ----7行目 12, zzz , def, aaa , ggg   ----8行目 【変換後】 10, abc , def , ghi ,jkl    ----1行目 11, abc , def , eee , fff   ----4行目 11, zzz , def , aaa , ggg  ----6行目 12, abc , def , aaa ,ggg ----7行目 12, zzz , def, aaa , ggg   ----8行目 変換内容はcsv形式のテキストファイルで、”,”で区切った先頭3列が 前の行の先頭3列と同じならその行は出力しない、といった 変換をしたいと思っております。 (例えば2行目ですと先頭3列は10, abc ,defになっており、  1行目の先頭3列と同じ文字列になっているためこの行は出力しない) 当方、Perl初心者で上記のようなことがPerlでできるかも よくわかっておりません。 そこで、上記のような変換はPerlで可能なのか、そしてもし可能であるのなら どのようにPerlで記述すればできるのか教えていただけないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • EXCELについて

      A    B 1      123 2 ABC  ABC123 3 DEF 4 GHI 上記のような表があり、【B2】で【A2+B1】=【ABC123】という関数を組んでいます。 そこで、ご質問なのですが、B2列はそのままで、A列だけどんどん、A3【DEF123】、A4【GHI123】と【B2】のような関数を組みたいのですが、どうしたら宜しいでしょうか。コピーだと駄目ですし、一つずつ手入力するのもしんどいので、どなたか良い方法をお分かりの方、ご教授願います。