Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


949 / 13645 ツリー ←次へ | 前へ→

【77341】2個ペアで並べ替えと番号をつけたい マリモ 15/7/24(金) 10:51 質問[未読]
【77342】Re:2個ペアで並べ替えと番号をつけたい ウッシ 15/7/24(金) 12:28 回答[未読]
【77346】Re:2個ペアで並べ替えと番号をつけたい マリモ 15/7/24(金) 17:20 お礼[未読]
【77343】Re:2個ペアで並べ替えと番号をつけたい kanabun 15/7/24(金) 12:56 発言[未読]
【77344】Re:2個ペアで並べ替えと番号をつけたい kanabun 15/7/24(金) 12:58 発言[未読]
【77347】Re:2個ペアで並べ替えと番号をつけたい マリモ 15/7/24(金) 17:25 お礼[未読]
【77345】Re:2個ペアで並べ替えと番号をつけたい β 15/7/24(金) 14:52 発言[未読]
【77348】Re:2個ペアで並べ替えと番号をつけたい マリモ 15/7/24(金) 17:28 お礼[未読]

【77341】2個ペアで並べ替えと番号をつけたい
質問  マリモ  - 15/7/24(金) 10:51 -

引用なし
パスワード
   お世話になります
マリモと申します。

A列B列、C列D列・・・OT列までのペアで中には空欄もありまして
空欄は飛ばして記入のあるペアをB列c列に並べ替えをし、
その際に同じ行に書いてあったものは同じ番号をつけたいのですが、
量が多く手作業では追いつかないのでご相談させていただきました。

下記に記録例を載せます。

Sub Macro1()
'
' Macro1 Macro
'

'
  Sheets("Sheet2").Select
  Range("A1").Select
  ActiveCell.FormulaR1C1 = "番号"
  ActiveCell.Characters(1, 2).PhoneticCharacters = "バンゴウ"
  Range("B1").Select
  ActiveCell.FormulaR1C1 = "経度"
  ActiveCell.Characters(1, 2).PhoneticCharacters = "ケイド"
  Range("C1").Select
  ActiveCell.FormulaR1C1 = "緯度"
  ActiveCell.Characters(1, 2).PhoneticCharacters = "イド"
  Range("D1").Select
  Sheets("Sheet1").Select
  Range("A2:B2").Select
  Selection.Copy
  Sheets("Sheet2").Select
  Range("B2").Select
  ActiveSheet.Paste
  Sheets("Sheet1").Select
  Range("C2:D2").Select
  Application.CutCopyMode = False
  Selection.Copy
  Sheets("Sheet2").Select
  Range("B3").Select
  ActiveSheet.Paste
  Range("A2").Select
  Application.CutCopyMode = False
  ActiveCell.FormulaR1C1 = "1"
  Range("A3").Select
  ActiveCell.FormulaR1C1 = "1"
  Range("B3").Select
  Sheets("Sheet1").Select
  Range("A3:B3").Select
  Selection.Copy
  Sheets("Sheet2").Select
  Range("B4").Select
  ActiveSheet.Paste
  Sheets("Sheet1").Select
  Range("C3:D3").Select
  Application.CutCopyMode = False
  Selection.Copy
  Sheets("Sheet2").Select
  Range("B5").Select
  ActiveSheet.Paste
  Range("A4").Select
  Application.CutCopyMode = False
  ActiveCell.FormulaR1C1 = "2"
  Range("A5").Select
  ActiveCell.FormulaR1C1 = "2"
  Range("B5").Select
  Sheets("Sheet1").Select
  Range("A4:B4").Select
  Selection.Copy
  Sheets("Sheet2").Select
  Range("B6").Select
  ActiveSheet.Paste
  Sheets("Sheet1").Select
  Range("C4:D4").Select
  Application.CutCopyMode = False
  Selection.Copy
  Sheets("Sheet2").Select
  Range("B7").Select
  ActiveSheet.Paste
  Sheets("Sheet1").Select
  Range("E4:F4").Select
  Application.CutCopyMode = False
  Selection.Copy
  Sheets("Sheet2").Select
  Range("B8").Select
  ActiveSheet.Paste
  Sheets("Sheet1").Select
  Range("G4:H4").Select
  Application.CutCopyMode = False
  Selection.Copy
  Sheets("Sheet2").Select
  Range("B9").Select
  ActiveSheet.Paste
  Sheets("Sheet1").Select
  Range("I4:J4").Select
  Application.CutCopyMode = False
  Selection.Copy
  Sheets("Sheet2").Select
  Range("B10").Select
  ActiveSheet.Paste
  Range("A6").Select
  Application.CutCopyMode = False
  ActiveCell.FormulaR1C1 = "3"
  Range("A6").Select
  Selection.AutoFill Destination:=Range("A6:A10"), Type:=xlFillDefault
  Range("A6:A10").Select
  Range("C11").Select
End Sub

よろしくお願いいたします。

【77342】Re:2個ペアで並べ替えと番号をつけたい
回答  ウッシ  - 15/7/24(金) 12:28 -

引用なし
パスワード
   こんにちは

偶数個じゃない場合の最後の1個もセットするとして、

Sub test()
  Dim i  As Long
  Dim j  As Long
  Dim k  As Long
  Dim n  As Long
  Dim sh1 As Worksheet
  Dim sh2 As Worksheet
  Dim t  As Range
  
  n = Range("OT1").Column
  
  Set sh1 = Worksheets("Sheet1")
  Set sh2 = Worksheets("Sheet2")
  
  With sh2
    .Cells.Delete
    .Range("A1:C1").Value = Array("番号", "経度", "緯度")
    k = 1
    For i = 2 To sh1.Range("A1").CurrentRegion.Rows.Count
      Set t = sh1.Range(sh1.Cells(i, 1), sh1.Cells(i, n + 1))
      For j = 1 To n
        If t(1, j) <> "" Then
          .Range("A" & .Rows.Count).End(xlUp).Offset(1) = k
          .Range("A" & .Rows.Count).End(xlUp).Offset(, 1) = t(1, j)
          Do
            If j > n Then Exit Do
            j = j + 1
          Loop While t(1, j) = ""
          .Range("A" & .Rows.Count).End(xlUp).Offset(, 2) = t(1, j)
        End If
      Next
      k = k + 1
    Next
  End With
End Sub

【77343】Re:2個ペアで並べ替えと番号をつけたい
発言  kanabun  - 15/7/24(金) 12:56 -

引用なし
パスワード
   ▼マリモ さん:

マクロ記録をマクロにするときの参考にしてください

Select , Selection を使ったマクロの記録のままは、とっても読みにくい。
ので、マクロ記録の最初の方だけですけど、Select Selection をとってみると
以下のようです。
Sub Macro1M()
'
 Sheets("Sheet2").Range("A1:C1").Value = Array("番号", "経度", "緯度")
  
'(1行目)
 Sheets("Sheet1").Range("A2:B2").Copy Sheets("Sheet2").Range("B2")
 Sheets("Sheet1").Range("C2:D2").Copy Sheets("Sheet2").Range("B3")
 Sheets("Sheet2").Range("A2:A3").Value = 1
 
'(2行目)
 Sheets("Sheet1").Range("A3:B3").Copy Sheets("Sheet2").Range("B4")
 Sheets("Sheet1").Range("C3:D3").Copy Sheets("Sheet2").Range("B5")
 Sheets("Sheet2").Range("A4:A5").Value = 2
  
'(以下同様)

End Sub

このまとめたものをみながら、2重ループで
・外側 2行目から 最下行まで ループ
・内側 1列目から 最終列まで 2列づつ
の構文に直してみました。

Sub MMcopy()

 Dim i As Long, j As Long  'コピー元行、列番号
 Dim n As Long, m As Long  'コピー元 最終行、最終列番号
 Dim y As Long, y1 As Long  'コピー先行番号
 Dim k As Long        'コピー先連番用
 Dim COP As Boolean
 Dim r As Range
 
 With Sheets("Sheet2")
   .UsedRange.Clear
   .Range("A1:C1").Value = Array("番号", "経度", "緯度")
   Set r = .Range("A1")    'コピー先シート先頭セル
 End With
 With Sheets("Sheet1")
   With .Range("A1").CurrentRegion
     n = .Rows.Count
     m = .Columns.Count
   End With
   y = 1
   For i = 2 To n
     For j = 1 To m Step 2
       If Not IsEmpty(.Cells(i, j).Value) Then
         y = y + 1
         If Not COP Then COP = True: y1 = y
         r(y, 2).Resize(, 2) = .Cells(i, j).Resize(, 2).Value
       End If
     Next
     If COP Then
       k = k + 1
       r(y1, 1).Resize(y - y1 + 1).Value = i - 1
     End If
     COP = False
   Next
 End With
  
End Sub

【77344】Re:2個ペアで並べ替えと番号をつけたい
発言  kanabun  - 15/7/24(金) 12:58 -

引用なし
パスワード
   失礼

>     If COP Then
>       k = k + 1
>       r(y1, 1).Resize(y - y1 + 1).Value = i - 1
>     End If
>     COP = False
>   Next
> End With
>  
>End Sub



>     If COP Then
>       k = k + 1
       r(y1, 1).Resize(y - y1 + 1).Value = k
>     End If
>     COP = False
>   Next
> End With
>  
>End Sub

こう書くつもりでした m(_ _)m

【77345】Re:2個ペアで並べ替えと番号をつけたい
発言  β  - 15/7/24(金) 14:52 -

引用なし
パスワード
   ▼マリモ さん:

提示されたコードのように、各2個のセルの転記を繰り返すと、膨大なコードになりますね。
アップされたコードでは、ペアが空白かどうかのチェックをしていませんので、それも加えると
すざましい長さのコードになりますね。

また、これはマクロ記録の宿命ですけど、Select/Selectionのてんこ盛りになります。

やはり、For/Next や Do/Loop といったループ処理が望ましいですね。
以下も、一例として。

Sub Test()
  Dim x As Long
  Dim i As Long
  Dim j As Long
  
  Dim v As Variant
  ReDim v(1 To Rows.Count - 1, 1 To 3)
  
  With Sheets("Sheet1")
    For i = 2 To .Range("A1").CurrentRegion.Rows.Count
      For j = 1 To Columns("OT").Column Step 2
        If Not IsEmpty(.Cells(i, j)) Or Not IsEmpty(.Cells(i, j + 1)) Then
          x = x + 1
          If x > UBound(v, 1) Then
            MsgBox "データが多すぎてシートに展開しきれません"
            Exit Sub
          End If
          v(x, 1) = i - 1
          v(x, 2) = .Cells(i, j).Value
          v(x, 3) = .Cells(i, j + 1).Value
        End If
      Next
    Next
  End With
  
  With Sheets("Sheet2")
    .Cells.ClearContents
    .Range("A1:C1").Value = Array("番号", "経度", "緯度")
    .Range("A2:C2").Resize(x).Value = v
    .Select
  End With
  
End Sub

【77346】Re:2個ペアで並べ替えと番号をつけたい
お礼  マリモ  - 15/7/24(金) 17:20 -

引用なし
パスワード
   ありがとうございます。
おかげですんなりできました。

以前もお世話になり
重ねて御礼申し上げます。

【77347】Re:2個ペアで並べ替えと番号をつけたい
お礼  マリモ  - 15/7/24(金) 17:25 -

引用なし
パスワード
   教えていただきまして
ありがとうございます。

今後、教えていただいたことを
実行できるように努めます。

以前も教えていただき
重ねて御礼申し上げます。

【77348】Re:2個ペアで並べ替えと番号をつけたい
お礼  マリモ  - 15/7/24(金) 17:28 -

引用なし
パスワード
   ありがとうございます。

そうですね。
勉強になりました。

949 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free