Excel VBA質問箱 IV

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

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


10715 / 76734 ←次へ | 前へ→

【71564】Re:表の整理
回答  UO3  - 12/3/17(土) 9:39 -

引用なし
パスワード
   ▼ドカ さん:

出発前に時間が取れたので、シートを見ながら、手作業で切り貼りや並び替えやセルの挿入をする
そんな流れをコードにしてみました。
処理効率、かなり悪くなりますが、操作とコードが一致しているので、理解しやすいかもしれません。
先にアップしたものは、元シートの列の左から右に、名前の出現順の並びでしたが、こんどのものは
名前の昇順になります。

Sub Sample2()
  Dim blocks As Long
  Dim x As Long
  Dim y As Long
  Dim wkCol1 As Long
  Dim wkCol2 As Long
  Dim j As Long
  Dim i As Long
  Dim k As Long
  Dim n As Long
  Dim c As Range
  Dim v() As Long
  Dim z As Long
  
  Application.ScreenUpdating = False
  
  With Sheets("Sheet2")
  '準備作業
    Sheets("Sheet1").Cells.Copy .Range("A1")  'Sheet1をSheet2にコピー
    With .Range("A1").CurrentRegion
      x = .Columns.Count   '表の列数
      y = .Rows.Count     '表の行数
    End With
    blocks = x \ 3
    wkCol1 = x + 2
    wkCol2 = wkCol1 + 2
    '各ブロックの名前列を作業列1にセットするとともに、名前順に並び替え
    i = 1
    For j = 1 To blocks
      k = (j - 1) * 3 + 1             'ブロックの名前列番号
      n = .Cells(.Rows.Count, k).End(xlUp).Row  'ブロックの名前列の最終行番号
      .Cells(i, wkCol1).Resize(n).Value = .Cells(1, k).Resize(n).Value
      .Columns(k).Resize(, 3).Sort Key1:=.Columns(k), Order1:=xlAscending, Header:=xlYes
      i = i + n
    Next
    'この名前から重複を排除し作業列2に抽出
    .Cells(1, wkCol1).CurrentRegion.AdvancedFilter Action:=xlFilterCopy, _
                    CopyToRange:=.Cells(1, wkCol2), Unique:=True
    '作業列2を名前順に並び替え
    .Columns(wkCol2).Sort Key1:=.Columns(wkCol2), Order1:=xlAscending, Header:=xlYes
  '作業列2から名前を取り出して処理開始
    i = 2    '表のデータ開始行
    For Each c In .Cells(1, wkCol2).CurrentRegion
      If c.Value <> .Range("A1").Value Then    '名前タイトル文字ならスキップ
        ReDim v(1 To blocks)
        z = 0
        For j = 1 To blocks
          k = (j - 1) * 3 + 1             'ブロックの名前列番号
          n = .Cells(.Rows.Count, k).End(xlUp).Row  'ブロックの名前列の最終行番号
          v(j) = WorksheetFunction.CountIf(.Columns(k), c.Value) 'この列のこの名前の個数
          If v(j) > z Then z = v(j)                '全体のこの名前の個数の最大値
        Next
        For j = 1 To blocks
          k = (j - 1) * 3 + 1             'ブロックの名前列番号
          n = 0
          If .Cells(i, k).Value <> c.Value Then
            n = z
          Else
            n = z - v(j)
          End If
          If n > 0 Then
            .Cells(i + v(j), k).Resize(n, 3).Insert Shift:=xlDown
          End If
        Next
        i = i + z
      End If
    Next
    .Cells(1, wkCol1).CurrentRegion.Clear  '作業列1のクリア
    .Cells(1, wkCol2).CurrentRegion.Clear  '作業列2のクリア
    .Select
  End With
  
  
  Application.ScreenUpdating = True
  MsgBox "転記完了です"
  
End Sub
11 hits

【71555】表の整理 ドカ 12/3/16(金) 20:43 質問
【71557】Re:表の整理 ドカ 12/3/16(金) 20:54 発言
【71559】Re:表の整理 何か変じゃないですか 12/3/16(金) 22:44 発言
【71561】Re:表の整理 ドカ 12/3/17(土) 4:42 発言
【71560】Re:表の整理 UO3 12/3/16(金) 23:09 発言
【71562】Re:表の整理 ドカ 12/3/17(土) 4:57 お礼
【71564】Re:表の整理 UO3 12/3/17(土) 9:39 回答
【71671】Re:表の整理 ドカ 12/3/27(火) 14:10 質問
【71672】Re:表の整理 UO3 12/3/27(火) 16:43 発言
【71673】Re:表の整理 UO3 12/3/27(火) 17:20 発言
【71674】Re:表の整理 ドカ 12/3/27(火) 20:11 発言
【71675】Re:表の整理 ドカ 12/3/28(水) 9:08 お礼
【71676】Re:表の整理 UO3 12/3/28(水) 10:34 発言
【71677】Re:表の整理 ドカ 12/3/28(水) 11:10 発言
【71678】Re:表の整理 UO3 12/3/28(水) 15:08 発言
【71679】Re:表の整理 UO3 12/3/28(水) 15:13 発言
【71683】Re:表の整理 ドカ 12/3/28(水) 20:34 お礼
【71688】Re:表の整理 ドカ 12/3/30(金) 8:29 質問
【71689】Re:表の整理 ドカ 12/3/30(金) 9:06 質問
【71690】Re:表の整理 UO3 12/3/30(金) 10:27 発言
【71691】Re:表の整理 UO3 12/3/30(金) 11:46 発言
【71692】Re:表の整理 UO3 12/3/30(金) 21:10 発言
【71720】Re:表の整理 UO3 12/4/2(月) 14:10 発言
【71724】Re:表の整理 ドカ 12/4/3(火) 7:59 お礼
【71728】Re:表の整理 UO3 12/4/3(火) 13:16 発言
【71731】Re:表の整理 UO3 12/4/3(火) 16:54 発言
【71725】Re:表の整理 ドカ 12/4/3(火) 8:15 質問
【71726】Re:表の整理 UO3 12/4/3(火) 12:39 発言
【71727】Re:表の整理 UO3 12/4/3(火) 12:44 発言
【71736】Re:表の整理 ドカ 12/4/4(水) 15:59 お礼

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