過去ログ

                                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列にしなければならないのですが、
データ量が多くて大変なので、マクロにしたいと
思っていますが、どのようにしたらよいのかわかりません。
簡単な質問かもしれませんが、どなたか教えてください。
 ───────────────────────────────────────  ■題名 : Re:データの並べ替えをしたいのですが。  ■名前 : かず  ■日付 : 03/2/18(火) 12:31  -------------------------------------------------------------------------
   データの開始位置が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
 ───────────────────────────────────────  ■題名 : Re:データの並べ替えをしたいのですが。  ■名前 : ポンタ  ■日付 : 03/2/18(火) 12:34  -------------------------------------------------------------------------
   すでに回答が出てますが、よろしかったらこちらもどうぞ。

標準モジュールに以下のコードを貼り付け、
対象のシートをアクティブしてお試しください。

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
 ───────────────────────────────────────  ■題名 : Re:データの並べ替えをしたいのですが。  ■名前 : ポリンキー  ■日付 : 03/2/18(火) 13:22  -------------------------------------------------------------------------
   ありがとうございました。
マクロのマの字もわからないのにマニュアルだけ渡されて、
誰も教えてくれる人がいなかったので、とても助かりました。
あとは、なんとか自力で頑張ってみます。かずさん、ポンタ
さん、ご親切にありがとうございました。
 ───────────────────────────────────────  ■題名 : 最終データの判断についても教えてください。  ■名前 : ポリンキー  ■日付 : 03/2/19(水) 9:45  -------------------------------------------------------------------------
   ご丁寧に教えていただいたおかげで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)で
最終データを取得できると思うのですが、記述方法がわかりません。
初歩的なことだと思うので、申し訳ありませんが、よろしくお願いいたします。
 ───────────────────────────────────────  ■題名 : Re:最終データの判断についても教えてくだ...  ■名前 : ポンタ  ■日付 : 03/2/19(水) 10:13  -------------------------------------------------------------------------
   書き換えちゃったほうが早いような気がします。

お試しください。

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
 ───────────────────────────────────────  ■題名 : Re:最終データの判断についても教えてくだ...  ■名前 : ポリンキー  ■日付 : 03/2/21(金) 11:03  -------------------------------------------------------------------------
   風邪で仕事をお休みしてしまい、お礼が遅くなりました。
ポンタさん、ご丁寧に教えていただき、ありがとうございました。
参考書をひきひきVBAに慣れていきたいと思っています。
また、わからないことがありましたら、よろしくお願いいたします。
 ───────────────────────────────────────  ■題名 : 位置を検索したいのですが・・・  ■名前 : ポリンキー  ■日付 : 03/3/17(月) 11:01  -------------------------------------------------------------------------
   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の前の行までという風にしたいと思っています。

 簡単な質問かもしれませんが、初心者で変数がまだあまりわかっていません。
どうぞよろしくお願いいたします。
 ───────────────────────────────────────  ■題名 : Re:位置を検索したいのですが・・・  ■名前 : ポンタ  ■日付 : 03/3/17(月) 11:31  -------------------------------------------------------------------------
   ヘッダー部分をどうすればよいのか分かりませんが、
とりあえず、以下のコードに差し替えてみてください。

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
 ───────────────────────────────────────  ■題名 : Re:位置を検索したいのですが・・・  ■名前 : ポリンキー  ■日付 : 03/3/17(月) 13:58  -------------------------------------------------------------------------
   ▼ポンタ さん:
いつもありがとうございます。お手数おかけしております。
実行してみたところ、★印のところでオーバーフローしてしまいました。
どうしてなんでしょう???ちなみに実行したデータは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
 ───────────────────────────────────────  ■題名 : どうもすみません。転記ミスでした。  ■名前 : ポリンキー  ■日付 : 03/3/17(月) 15:09  -------------------------------------------------------------------------
   ポンタさん

 どうもすみません。.End(xlUp)を.End(xlDown)と書いてしまいました。
ご丁寧に教えていただき、ありがとうございました。頑張ってみます。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 885