• ベストアンサー

vbaにて並べ替えしたい。

並べ替えするには? ただいまVBA学習中です。 sheet1に次のような文字列がセルに入力されているとします。 3列で30行あります。   A列 B列 C列 1行 あ  い  う 2行 え  お  か ...以下30行まで続く。 これらを sheet2に A列 あ い う え お か のようにひとつの列へ縦にするにはどのような記述になりますか? 私なりの考え方ですが セルのスタート位置はシート1のA1とします。  シート1にて  ・あ い う と順番に配列に格納  ・セルを左に2つ下に1つ移動   この動作を30回繰り返す(for next 使えばでいいですよね?)  シート2に移動してA1から下方向へ  格納された文字列を入力する。  と、考えてみたものの記述の仕方がわかりません。 力貸してください。   

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

  • ベストアンサー
  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.4

> 追加の質問したいのですが・・・ こんな感じでどうですか。 実行時、どのシートがアクティブになっていても構わないコードになっていますが、 "Sheet1" アクティブが条件なら Sheets("Sheet1"). が不要でチョット簡単になります。 Sub test() Dim Rw As Long Dim Rw2 As Long Dim MaxRow As Long MaxRow = Range("E65536").End(xlUp).Row If MaxRow = 1 Then Exit Sub Sheets("Sheet2").Columns(1).ClearContents Rw2 = 1 For Rw = 2 To MaxRow   With Sheets("Sheet2")     .Range("A" & Rw2).Value = Range("E1").Value     .Range("A" & Rw2 + 1).Value = Sheets("Sheet1").Range("E" & Rw).Value     .Range("A" & Rw2 + 2).Value = Sheets("Sheet1").Range("F1").Value     .Range("A" & Rw2 + 3).Value = Sheets("Sheet1").Range("F" & Rw).Value     .Range("A" & Rw2 + 4).Value = Sheets("Sheet1").Range("G1").Value     .Range("A" & Rw2 + 5).Value = Sheets("Sheet1").Range("G" & Rw).Value     .Range("A" & Rw2 + 6).Value = vbNullString     Rw2 = Rw2 + 7   End With Next Rw End Sub

norinori555
質問者

お礼

ありがとうございました。おかげでうまくできそうです。

その他の回答 (3)

  • mohenjo
  • ベストアンサー率37% (125/335)
回答No.3

相当、邪道ですがsheet2の1行目に見出しがあるとして Sub test() Dim rngS As Range For Each rngS In ActiveSheet.UsedRange rngS.Copy Sheets(2).Range("A65536") _ .End(xlUp).Offset(1) Next rngS End Sub 上記であれば何行でも可能ですが? 勘違いならすいません。

norinori555
質問者

お礼

ありがとうございます。 なんか、だんだん難しくなってきてる印象受けてます。 でもこれがわかるとなにかと便利なんでしょうね。 (1) For Each rngS In ActiveSheet.UsedRange の部分は「アクティブシートの記入済みセルそれぞれについて」という意味と解釈しました。 rngS.Copy Sheets(2).Range("A65536").End(xlUp).Offset(1) はA列すべてって意味かな?たぶん。 で、正しく作動したのですが、なんか不思議な感じします。セルをひとつづつ指定せず、範囲という形で指定していますが、順序よく整列されてシート2に出力されました。 なんでだろ?  RANGEは 左から右 上から下 という順番で処理してくれているようですね。

norinori555
質問者

補足

追加の質問したいのですが、みなさまよいでしょうか。     E列 F列 G列 1行  問題  解答  解説 2行  あああ いいい ううう 3行  えええ おおお かかか 4行  ききき くくく けけけ ・・・このようなのが30行ぐらいあります。 今後も増えます。 とあるものを シート2のA列に 問題 あああ 解答 いいい 解説 ううう 「空白のセル」 問題 えええ 解答 おおお 解説 かかか 「空白のセル」 問題 ききき 解答 くくく 解説 けけけ 「空白のセル」 ・・・以下繰り返し。 の場合はどうなるでしょうか?

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.2

こんな感じでどうですか。 Sub test() Dim Rng As Range Dim Rw As Long For Each Rng In Sheets("Sheet1").Range("a1:c30")   Rw = Rw + 1   Sheets("Sheet2").Cells(Rw, 1).Value = Rng.Value Next Rng End Sub

norinori555
質問者

お礼

なるほど、配列を使わなくてもできますね。 ひとつづつ、シート2に文字を記入していっている わけですね。

  • coco1
  • ベストアンサー率25% (323/1260)
回答No.1

こんばんは。 あくまでも一つの例です。 Public Sub MySort() Dim MyStr(90) As String Dim cnt As Integer cnt = 1 For r = 1 To 30 For c = 1 To 3 MyStr(cnt) = Sheet1.Cells(r, c) cnt = cnt + 1 Next c Next r cnt = 0 Sheet2.Activate Range("a1").Select For r = 1 To 90 Cells(r, 1).Value = MyStr(r) Next r End Sub

norinori555
質問者

お礼

#1~#3の皆様、まずはお礼を申し上げます。 ただいま、皆様から教えていただいた内容を もとに、VBAを動かしてます。 for each とrangeの使い方についての例文が 記載されているサイトも探してます。 自分用に書き換えしているのですが ちょっとうまく動いてくれないで原因を 調べてます。 ですので配点はもう少しお待ちください。

関連するQ&A

  • VBA 行の削除

    全くの初心者で、初めて質問させていただきます。 A列には、数字・空白・文字を入力したセルが混在しています。 そのA列の数字の内 0 のセルが入力されている行のみを削除するVBAの記述の仕方を教えて下さい。 宜しく御願い致します。

  • Excel VBA 値取得について

    お世話になります。 どなたかお力をお貸しください。 Excel2003 VBAでプログラムを組んでおり、エクセルのシートをデータベース代わりに利用しています。 複数のブック散乱している10万個近くのテキストボックスの値を、 「A」というブックの「シート1」のセルに格納して行きたいと思っております。 値の格納方法としては、「A」ブックの「シート1」の セルA1からA2、A3…A列最終行(6万強)まで縦の並びにデータを格納していきます。 ただし、「シート1」に格納したい値は10万個近くあるので、 A列だけでは足りなくなります。 A列の最終行まで値を格納し終えたら、自動的にB列に移動して、 セルB1からB2、B3…B列最終行(6万強)という遷移させていきたいのです。 A列のみに格納していくのであれば、理解できるのですが、 自動遷移がわかりません。 For i = 0 To 最終行(6万強) シート1.Range("A" & i) = 参照元 Next i よろしくお願いします。

  • EXCEL VBA 別シートの文字をシート内で検索

    excel2003 VBAで SHEET2に格納されているセルの文字をSHEET1のB列1~9000程度までの文字列の中で一致または部分一致するものがあればそのセル(B列のセル)をSHEET3に順次A列に出力したいのですが、うまくできません。SHEET2に格納されている場所はA列で(SHEET1、SHEET2の文字とも増える可能性あり) 宜しくお願いします。

  • VBAの

    VBAで特定の列で文字マッチングをして、ヒットした行をシートAからシートBにコピーしたいと考えています。 単にセルの値を全コピーするだけなら可能です。しかし、このときにシートAが何行、何列あるか分からない場合、可変長なシートAを特定の列で文字マッチングをして、シートBにコピーするためにはどのようにすればよいのでしょうか?

  • VBAでエクセルのいくつかの表を同じ配列に格納する

    VBA初心者です。 調べてみましたがどうにも情報に行きあたらなく、ご質問をさせていただきます。 添付のようなエクセル上の同一シート上にある3つの表をコピーし、VBAで同じ配列の各列として取り込みをしたいと考えております。 大分類、中分類、小分類のそれぞれの行は同じもののそれぞれの内容を記載しており、 できればこれらを同じ配列の1列目、2列目、3列目に格納をしたいと思っております。 これらの表が1つの表にまとまっていれば、 Dim 配列(1,10) as Variant 配列 =range("A1:C10") で事足りると思うのですが、別々のためこの方法がとれません。 セル指定で行うことも考えましたが、データが10万行を超える場合もあるため、できれば避けたいと思っています。 各表を指定し、配列の1列目、2列目、3列目に一括して代入をご存じでしたらら、どうぞ教えていただきたいと思います。 どうぞよろしくお願いします。

  • EXCEL VBA:文字列のコピー

    1. intputbox で入力したパスにある全ての txtファイル名を sheet1 C列に表示。 (現在 6ファイルでテスト。予定作業で100ファイル程度) 2. 配列を使って C列のファイル名のファイルを順番に読み込み sheet2 A列に行単位で読み込み。 →今ココ 3. sheet2 A列に表示されたファイルに hostname_abcde という行があり、abcde 部分だけを sheet1 A列にコピー。 ( _ は半角スペースに読み替えてください。hostname_を検索すればいいのですが、その後に 続く abcde がファイルによって文字数が異なりコピーする方法が分かりません) 4. 「3.」のコピー後に sheet2全セルをクリアして 動的配列の next文へ進み、要素2 のテキスト ファイルを sheet2 A列に読み込みまた、 hostname_abcde の abcde を sheet1 A列の次のセルに コピー。要素数分繰り返します。 実際に記述した内容は職場のPCでないと分からないので詳しく書けませんが、上記 3. と 4. の 方法をご教示頂きたくお願い致します。

  • エクセルのVBAで

    ある列(仮にA列とします)の最終行がA30であり A25までは空白だとします。 この時に、A30の値をA29~A25=データの入力されていないセルに入力(コピー)するにはVBAでどのように記述すればいいのでしょうか? 最終行から、上にその最終行の値をデータの入力されているセルに達するまで入力(コピー)したいのですが。 分りづらい表現で申し訳ありませんが、よろしくお願い致します。

  • 【excel2003 vba】指定した文字列が入力されている「セル範囲」の表示方法?

    ◎Sheet1  A B C D E 1○○○-- 2○○○×× 3---×× 4×○--- ※「-」は空白 上記のようにセルに「○」「×」が入力されている「Sheet1」シートがあります。(例として○×の2種類を使っていますが、本当はもっとたくさんの種類の文字列があります。) vbaを使って、以下の一覧表を「List」シートに作成するコードを作成できませんでしょうか? ◎List  A     B 1○     ×  '文字列の種類 2A1:C2  D2:E3 '文字列の範囲  3B4     A4  '同上 【ToDo】 (1)1行目に文字列(○、×)を入力する (2)1行目に入力してある文字列が入力されているすべての「セル範囲」を2行目以降の各列に抽出する。 **1セル内に「○」「×」の両方が入力されているものもある。**  ⇒例えば、A1セルに「○×」と入力されていたら、「Rist」シートのA列B列の両方に「A1」が抽出されるようにしたい。 1セルごとのセル番地(○:A1,A2,B1,…)を一覧化することはできるのですが、同じ文字列をまとめた「範囲」の抽出ができないのです。 どなたかお力添えをお願いできませんでしょうか? 宜しくお願い致します。

  • "VBAの繰り返し"についてお尋ねします。VBA初心者です。

    "VBAの繰り返し"についてお尋ねします。VBA初心者です。 例えば「A列の最後のセルに何か入れば、その行のB列、C列・・・の一つ上のセルに入っている計算式を繰り返しコピーする」と言うコードを教えていただけたらと思います。A列の最後のセルに何か入ってくれば、その行の一つ上のセルに入っている計算式を繰り返しコピーするというコードです。コード記述の例を教えていただけたらと思います。よろしくお願いします。

  • エクセルvba初心者です・・・

    エクセルvba初心者です・・・ シート1にあるひとつのセルをコマンドボタンを押した時にそのセル内の文字列をシート2にかいていくようなプログラムをつくりたいです。 例えば シート1のセルに文字入力→”田中”→登録ボタンおす→シート2のセルA1にはいる シート1のセルに文字入力→”竹山”→登録ボタンおす→シート2のセルA2にはいる                  ・                  ・                  ・ というようになるコードわかる方いたら教えてください。おねがいします。

専門家に質問してみよう