こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルVBA 繰り返し

エクセルVBAで

  ABCD       ABCD
        
1 54 1      1 145  
2 24 3     2 234
3   1      3 1

上記の左のようなデータを右ように
各行ごとに並び替えをしたいのですが、
どのようにしたらいいのでしょうか。

Range("A1:D1").Select
Application.CutCopyMode = False
Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlLeftToRight, SortMethod _
:=xlPinYin, DataOption1:=xlSortNormal

1行だとこんなんがでてきました。
これをどうしたら、3行4行と増やしていけますか?
50行ほどくりかえしたいです。

どなたか分かる方 お願いします。

投稿日時 - 2011-01-22 20:24:22

QNo.6467163

すぐに回答ほしいです

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

各行A:D列対象なら
For i = 1 to 50
Range("A" & i & ":D" & i).select
Application.CutCopyMode = False
Selection.Sort Key1:=Range("A" & i), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlLeftToRight, SortMethod _
:=xlPinYin, DataOption1:=xlSortNormal
Next i

投稿日時 - 2011-01-22 20:44:34

お礼

VBA初心者なので、
とてもシンプルで使いやすかったです。

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

投稿日時 - 2011-01-24 17:52:27

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

こんな感じでいかがでしょう。

Sub Sample()
Dim rNum As Long

rNum = 1
Do Until Cells(rNum, 1).Value & Cells(rNum, 2).Value _
& Cells(rNum, 3).Value & Cells(rNum, 4).Value = ""
Range("A" & rNum & ":D" & rNum).Sort Key1:=Cells(rNum, 1), Orientation:=xlLeftToRight
rNum = rNum + 1
Loop
End Sub

投稿日時 - 2011-01-23 00:33:19

お礼

VBA初心者ですみません。
ちと、難しいです。

投稿日時 - 2011-01-24 17:48:44

ANo.3

人と同じコードを書いてもしょうがないので、違うコードを書きました。
特に、問題はないと思いますが、最後の行を検出するために、End プロパティですと、心もとないです。一行ずつするなら、あまり、Sort メソッドは必要ないような気もします。

列は、可変ですから、D列、E列でも、それ以上でも可能です。なるべく標準モジュールに登録してお使いください。

Sub Test1()
 Dim rng As Range
 Dim LstRow As Long, LstCol As Long
 Dim i As Long, j As Long
 Dim ar As Variant
 Set rng = Range("A1").CurrentRegion
 With rng
  LstRow = .Cells(.Cells.Count).Row
  LstCol = .Cells(.Cells.Count).Column
  ReDim arx(1 To LstCol)
 End With
 For i = 1 To LstCol
  arx(i) = i
 Next
 With Application
  .ScreenUpdating = False
  For i = 1 To LstRow
   ar = .Transpose(Range(Cells(i, 1), Cells(i, Columns.Count).End(xlToLeft)))
   'ar = .Transpose(Range(Cells(i, 1), Cells(i, LstCol + 1).End(xlToLeft))) '※
   ar = .Transpose(ar)
   ar = .Small(ar, arx)
   j = .Count(ar)
   Cells(i, 1).Resize(, LstCol).ClearContents
   Cells(i, 1).Resize(, j).Value = ar
  Next i
  .ScreenUpdating = True
 End With
End Sub

もし、右側にデータがある場合は、※と。その上の行と交換してください。

投稿日時 - 2011-01-22 23:01:26

お礼

VBA初心者のため、
なかなか、理解はできません。
これから、がんばります。
ありがとうございました。

投稿日時 - 2011-01-24 17:49:37

ANo.2

たとえば

dim n
Application.CutCopyMode = False
for n = 0 to range("A65536").end(xlup).row - 1
 Range("A1:D1").offset(n).Sort _
  Key1:=Range("A1").offset(n), _
  Order1:=xlAscending, _
  Header:=xlno, _
  OrderCustom:=1, _
  MatchCase:=False, _
  Orientation:=xlLeftToRight, _
  SortMethod:=xlPinYin, _
  DataOption1:=xlSortNormal
next n

みたいなカンジで。
for to nextとfor nextは繰り返しの基本中の基本ですから,参考書(や,もし良いのが見つかればネット)でしっかりマスターしてください。
offsetを使う他に,headerの所も変えているで見落とさないようにしてください。

投稿日時 - 2011-01-22 21:36:12

お礼

基本中の基本を質問して、
ごめんなさい。

たいへんべんきょうになりました。
これから、頑張ります。

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

投稿日時 - 2011-01-24 17:51:03

あなたにオススメの質問