• ベストアンサー

[Excel2000] データの移動について

A列~F列までの文字データを以下のようにA列とB列の2列に移動させたいのですが、いくら考えてもわかりません。データが1000件以上あり、手作業ではミスをしかねないので、何かよい方法はないでしょうか?よろしくお願いします。 (手順) (1)B~D列のデータを縦に並べる。(B~Fには文字データが入ります。すべての列にデータがあるとは限りませんが、少なくとも、B列には必ずデータがあり、B、C、Dの順にデータが入っています。) (2)その左側にA列のデータを並べる。 (A列)   (B列) (C列) (D列) (E列) (F列) 000001    10      15    20 000002    5 000003    15     10    5    3     1 ↓ (A列) (B列)  000001  10 000001   15 000001   20 000002   5 000003  15 000003  10 000003   5 000003   3 000003   1

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

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.6

5列、1行を挿入して下のようにします。算式のみで行ってみます。  (A列)(B列)(C列)(D列)(E列)(F列)(G列)(H列)(I列) 1 2               000001___10____15____20 3               000002____5 4               000003___15____10_____5_____3____1 (1)A1に 1 を入力 (2)A2に =A1+COUNT(G2:IV2) を入力。F列のデータ数分A列下方向にコピーします (3)B2に =MATCH(ROW()-1,$A$1:$A$4,1)+1 としてB列下方向にコピー         (※上の$A$4はF列が4行目までの例です) (4)C2に =COUNTIF($B$2:B2,B2)      としてC列下方向にコピー (5)D2に =INDEX(F:F,B2)         としてD列下方向にコピー (6)E2に =OFFSET($F$1,B2-1,C2)     としてE列下方向にコピー (7)D:E列をコピーして、どこかに形式を選択して貼り付け→値 を実行します。

fuku_z
質問者

お礼

nishi6さん、いつもありがとうございます。 おかげさまで100%問題を解決することができました。その他の作業を含め、昨日と今日の2日間で、所期の目的を果たすことができました。 作業をしながら、「このような難問に善意で、しかも完璧に答えて下さる方がいるとは」と涙が出そうになりました。 nishi6さんが教えて下さった関数がそれぞれどのような役割を果たすのか今は調べる余裕もありませんが、理解できるように努力したいと思います。 本当にありがとうございました。

その他の回答 (7)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.8

>#7さんへ 釈迦に説法かもしれませんが、行の操作は Integer でなく Long を使用した方が良いと思います。 この例では問題ないでしょうが、行数によってはオーバーフローします。 Sub Test() Dim myCnt1 As Integer Dim myCnt2 As Long  Range("A32768").Value = 1  myCnt2 = ThisWorkbook.Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row  MsgBox "myCnt2 : " & myCnt2  myCnt1 = ThisWorkbook.Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row End Sub

fuku_z
質問者

お礼

回答ありがとうございました。

回答No.7

こんばんわ。シート1にしかデータが入っていないという過程でサンプルマクロを作ってみました。次のように操作してみて下さい。 ・データの入力されているブックを開き、ALT+F11キーを押してVBE画面を表示させ、画面左上にVBAProjectと書かれているところにマウスポインターをあわせて右クリック後、挿入→標準モジュールを順にクリックして表示された右側の白い部分に下記のコードをコピーペーストする。 Sub Deta_Seiri() Dim i As Integer Dim j As Integer Dim myCnt1 As Integer Dim myCnt2 As Integer myCnt1 = ThisWorkbook.Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row myCnt2 = ThisWorkbook.Worksheets(1).Cells(1, 1).End(xlToRight).Column For i = 2 To myCnt1 For j = 2 To myCnt2 If ThisWorkbook.Worksheets(1).Cells(i, j).Value <> "" Then ThisWorkbook.Worksheets(1).Cells(Rows.Count, 7).End(xlUp).Offset(1, 0).Value = ThisWorkbook.Worksheets(1).Cells(i, 1).Value ThisWorkbook.Worksheets(1).Cells(Rows.Count, 8).End(xlUp).Offset(1, 0).Value = ThisWorkbook.Worksheets(1).Cells(i, j).Value End If Next j Next i ThisWorkbook.Worksheets(1).Columns("A:F").Delete End Sub ・ALT+F11キーを再度押してエクセルの画面にもどり、メニューバーのツール→マクロ→マクロを順にクリックし、出てきたダイアログボックスの右側の実行ボタンをクリックする。 マクロが実行され、貴方様の思い通りの動作が確認できると思います。 ご不明な点・不具合がございましたら、ご遠慮なくなくお知らせ下さい。

fuku_z
質問者

お礼

kazuhiko5681さん、いつもありがとうございます。 試してみましたが、残念ながらエラーになってしまいました。 今回はnishi6さんの方法で解決しました。 回答ありがとうございました。

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.5

こんにちは。 コピーブック等のテスト環境で試して下さい。(使用する場合は内容のチェックも) シートを追加して転記します。 Sub Test() Dim Ws As Worksheet, mSheet As Worksheet Dim LRow As Long  Set mSheet = ActiveSheet  Set Ws = Worksheets.Add(after:=ActiveSheet)  For i = 1 To mSheet.Cells(65536, 1).End(xlUp).Row   For j = 2 To mSheet.Cells(i, 1).End(xlToRight).Column    LRow = Ws.Cells(65536, 1).End(xlUp).Row + 1    Ws.Cells(LRow, 1) = mSheet.Cells(i, 1)    Ws.Cells(LRow, 2) = mSheet.Cells(i, j)   Next j  Next i End Sub

fuku_z
質問者

お礼

papayukaさん、こんばんは。 返事が遅くなって申し訳ありません。 papayukaさんの作ってくださったマクロでバッチリでした。新しいシートに実行結果が出てくるなんてびっくりしてしまいました。(しかもすごい速さですね。) ただ、空白のセルも移動してしまうのでその分の削除が必要でした。でも、すごいマクロなので大切に保存しておきたいと思います。 回答ありがとうございました。

回答No.4

初めまして。貴方様のおやりになりたいことはマクロを組めば実にすばやく簡単に実行することができます。 もしよろしければ、コピー&ペーストをするだけで貴方様の思い通りの動作をするサンプルマクロを組んでみたいと思います。 ご希望の節は、次のことを教えて下さい。 ・データが入力されている最終の列番号 お手数をおかけいたします。よろしくお願いいたします。

  • tonyshoe
  • ベストアンサー率40% (16/40)
回答No.3

おっと失礼。とんちんかんな答えをしてしまいましたね。 takntさんの方法で良いでしょう。

fuku_z
質問者

お礼

回答ありがとうございました。

  • tonyshoe
  • ベストアンサー率40% (16/40)
回答No.2

コピーして貼り付けるときに、行列を入れ替えるを選択して貼り付けてください。 貼り付けのボタンの右にある▼で選択できます。

fuku_z
質問者

お礼

回答ありがとうございます。 No.6の方の回答により解決いたしました。

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

まず A列を BとCの間、 CとDの間、DとEの間、EとFの間にコピーします。 それで コピーしたA列とC列をA列、B列の後ろにくっつけます。 同じように、ほかの AとD、AとE、AとFをAとBの後ろに順にくっつけて、 B列でソートし、B列の何も入ってない行を削除してから、 A列、B列でソートすればいいでしょう。

fuku_z
質問者

お礼

回答ありがとうございます。 No.6の方の回答により解決いたしました。

関連するQ&A