Page 885 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼データの並べ替えをしたいのですが。 ポリンキー 03/2/18(火) 12:02 ┣Re:データの並べ替えをしたいのですが。 かず 03/2/18(火) 12:31 ┣Re:データの並べ替えをしたいのですが。 ポンタ 03/2/18(火) 12:34 ┃ ┗Re:データの並べ替えをしたいのですが。 ポリンキー 03/2/18(火) 13:22 ┗最終データの判断についても教えてください。 ポリンキー 03/2/19(水) 9:45 ┗Re:最終データの判断についても教えてくだ... ポンタ 03/2/19(水) 10:13 ┣Re:最終データの判断についても教えてくだ... ポリンキー 03/2/21(金) 11:03 ┗位置を検索したいのですが・・・ ポリンキー 03/3/17(月) 11:01 ┗Re:位置を検索したいのですが・・・ ポンタ 03/3/17(月) 11:31 ┗Re:位置を検索したいのですが・・・ ポリンキー 03/3/17(月) 13:58 ┗どうもすみません。転記ミスでした。 ポリンキー 03/3/17(月) 15:09 ─────────────────────────────────────── ■題名 : データの並べ替えをしたいのですが。 ■名前 : ポリンキー ■日付 : 03/2/18(火) 12:02 -------------------------------------------------------------------------
VBA超初心者です。よろしくお願いいたします。 1 2 3 4 5 6 7 8 9 10 11 12 ・・・・ というように4列にずーっと並んでいるデータがあって、 それを 1 2 3 4 というように1列にしなければならないのですが、 データ量が多くて大変なので、マクロにしたいと 思っていますが、どのようにしたらよいのかわかりません。 簡単な質問かもしれませんが、どなたか教えてください。 |
データの開始位置がA1セル、書き出しの開始位置がF1セルの場合の サンプルコードです。 ------------------------------------------------------------- Sub test() Columns("F:F").ClearContents '書き出し列クリア Do R = R + 1 '読み込みデータのセルの行番号 For C = 1 To 4 '読み込みデータのセルの列番号 R2 = R2 + 1 '書き出しデータのセルの行番号 Range("F1").Cells(R2, 1).Value = Range("A1").Cells(R, C).Value Next C '読み込みデータがなくなったら終了する If Range("A1").Cells(R + 1, 1).Value = "" Then Range("F1").Cells(R2 + 1, 1).Value = "End" Exit Sub End If Loop End Sub |
すでに回答が出てますが、よろしかったらこちらもどうぞ。 標準モジュールに以下のコードを貼り付け、 対象のシートをアクティブしてお試しください。 Sub test() Dim MyData() As Variant Dim i As Integer, j As Integer, k As Integer MyData = Range("A1", Range("D65536").End(xlUp)) k = 1 Range("A:D").ClearContents For i = 1 To UBound(MyData) For j = 1 To 4 Cells(k, 1).Value = MyData(i, j) k = k + 1 Next Next End Sub |
ありがとうございました。 マクロのマの字もわからないのにマニュアルだけ渡されて、 誰も教えてくれる人がいなかったので、とても助かりました。 あとは、なんとか自力で頑張ってみます。かずさん、ポンタ さん、ご親切にありがとうございました。 |
ご丁寧に教えていただいたおかげで4列データを1列データにすることが できましたが、もう一つわからないことがあるので教えてください。 1 2 3 4 5 6 7 8 9 10 11 12 ・・・・ 質問には上記のように4列データを書きましたが、 実際には、 1 2 3 4 5 6 7 8 9 10 11 *END のようになっています。*ENDの前の行に最終データがあるのですが、 4列目までうまっていることもあれば、1,2,3列目で終わっているこ ともあります。ですから、教えていただいた通りの以下のような マクロで実行すると、End(xlUp)のところで4列目の最終データまで になってしまい、上記の例ですと、9,10,11のデータは消えてしまい ます。 Sub test() Dim MyData() As Variant Dim i As Integer, j As Integer, k As Integer MyData = Range("A1", Range("D65536").End(xlUp)) k = 1 Range("A:D").ClearContents For i = 1 To UBound(MyData) For j = 1 To 4 Cells(k, 1).Value = MyData(i, j) k = k + 1 Next Next End Sub Aの列でEnd(xlUp)して、1行戻って、End(xlToRight)で 最終データを取得できると思うのですが、記述方法がわかりません。 初歩的なことだと思うので、申し訳ありませんが、よろしくお願いいたします。 |
書き換えちゃったほうが早いような気がします。 お試しください。 Sub test() Dim MyRange As Range Dim i As Integer, j As Integer Application.ScreenUpdating = False Call Range("A:A").Insert(xlShiftToRight) Set MyRange = Range("A1") For i = 1 To Range("B65536").End(xlUp).Row - 1 For j = 2 To Cells(i, 256).End(xlToLeft).Column MyRange.Value = Cells(i, j).Value Set MyRange = MyRange.Offset(1, 0) Next Next Range("B:E").ClearContents Application.ScreenUpdating = True End Sub |
風邪で仕事をお休みしてしまい、お礼が遅くなりました。 ポンタさん、ご丁寧に教えていただき、ありがとうございました。 参考書をひきひきVBAに慣れていきたいと思っています。 また、わからないことがありましたら、よろしくお願いいたします。 |
4列データには何行あるかわからないヘッダー部分があります。 ★★★ ヘッダー部分が何行か続く ★★★ *COUNT = 15 ・・・ヘッダー最終行 1 2 3 4 5 6 7 8 9 10 11 ・・・データ最終行 *END 4列データを1列データにするマクロは以下のように教えて いただきました。 >Sub test() > Dim MyRange As Range > Dim i As Integer, j As Integer > Application.ScreenUpdating = False > Call Range("A:A").Insert(xlShiftToRight) > Set MyRange = Range("A1") > For i = 1 To Range("B65536").End(xlUp).Row - 1 > For j = 2 To Cells(i, 256).End(xlToLeft).Column > MyRange.Value = Cells(i, j).Value > Set MyRange = MyRange.Offset(1, 0) > Next > Next > Range("B:E").ClearContents > Application.ScreenUpdating = True >End Sub For i = 1 〜 の1は*COUNTの次の行になると思うのですが、 こういう場合どのように変数を使えばよいのでしょうか? また、データの最終行に関しましても、後ろから1行目ということではなくて、 *ENDの前の行までという風にしたいと思っています。 簡単な質問かもしれませんが、初心者で変数がまだあまりわかっていません。 どうぞよろしくお願いいたします。 |
ヘッダー部分をどうすればよいのか分かりませんが、 とりあえず、以下のコードに差し替えてみてください。 Sub test() Dim MyRange As Range Dim i As Integer, j As Integer Application.ScreenUpdating = False Call Range("A:A").Insert(xlShiftToRight) For i = 1 To Range("B65536").End(xlUp).Row - 1 If Left(Cells(i, 2).Value, 6) = "*COUNT" Then Call 転記(i + 1) Exit For End If Next Application.ScreenUpdating = True End Sub Sub 転記(r As Long) Dim MyRange As Range Dim i As Integer, j As Integer Set MyRange = Range("A1") For i = r To Range("B65536").End(xlUp).Row - 1 For j = 2 To Cells(i, 256).End(xlToLeft).Column If Left(Cells(i, j).Value, 4) = "*END" Then Exit For Else MyRange.Value = Cells(i, j).Value Set MyRange = MyRange.Offset(1, 0) End If Next Next End Sub |
▼ポンタ さん: いつもありがとうございます。お手数おかけしております。 実行してみたところ、★印のところでオーバーフローしてしまいました。 どうしてなんでしょう???ちなみに実行したデータは84行目までがヘッダー です。よろしくお願いいたします。 >Sub test() > Dim MyRange As Range > Dim i As Integer, j As Integer > Application.ScreenUpdating = False > Call Range("A:A").Insert(xlShiftToRight) > For i = 1 To Range("B65536").End(xlUp).Row - 1 ★★★オーバーフロー > If Left(Cells(i, 2).Value, 6) = "*COUNT" Then > Call 転記(i + 1) > Exit For > End If > Next > Application.ScreenUpdating = True >End Sub > >Sub 転記(r As Long) > Dim MyRange As Range > Dim i As Integer, j As Integer > Set MyRange = Range("A1") > For i = r To Range("B65536").End(xlUp).Row - 1 > For j = 2 To Cells(i, 256).End(xlToLeft).Column > If Left(Cells(i, j).Value, 4) = "*END" Then > Exit For > Else > MyRange.Value = Cells(i, j).Value > Set MyRange = MyRange.Offset(1, 0) > End If > Next > Next >End Sub |
ポンタさん どうもすみません。.End(xlUp)を.End(xlDown)と書いてしまいました。 ご丁寧に教えていただき、ありがとうございました。頑張ってみます。 |