Excel VBA質問箱 IV

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

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


40245 / 76736 ←次へ | 前へ→

【41592】Re:縦セル内の文字を合成したいのです。
回答  Hirofumi  - 06/8/15(火) 12:11 -

引用なし
パスワード
   こんなかな?

'データは、A列〜E列の4列とし、転記するグループは、C列に有るとします
'実行時にC列で整列され終了直前に元の行位置に再整列されます

Option Explicit

Public Sub Sample()

  '元々のデータ列数(B列〜E列)
  Const clngColumns As Long = 4
  'グループの有る列(基準列B列からのC列の列Offset)
  Const clngGroup As Long = 1
  
  Dim i As Long
  Dim lngRows As Long
  Dim lngTop As Long
  Dim lngCount As Long
  Dim rngList As Range
  Dim vntResult As Variant
  Dim vntGroup As Variant
  Dim vntItems As Variant
  Dim strProm As String

  '画面更新を停止
  Application.ScreenUpdating = False
  
  'Listの先頭セル位置を基準とする(A列の列見出しのセル位置)
  Set rngList = ActiveSheet.Cells(1, "B")

  With rngList
    '行数の取得
    lngRows = .Offset(Rows.Count - .Row, clngGroup).End(xlUp).Row - .Row + 1
    If lngRows <= 0 And .Value = "" Then
      strProm = "データが有りません"
      GoTo Wayout
    End If
    '復帰用整列Keyを作成
    ReDim vntData(1 To lngRows, 1 To 1)
    For i = 1 To lngRows
      vntData(i, 1) = i
    Next i
    '復帰用Keyの出力
    .Offset(, clngColumns) _
          .Resize(lngRows).Value = vntData
    'データをC列で整列
    DataSort .Resize(lngRows, clngColumns + 1), .Offset(, clngGroup)
    'C列データを配列に取得
    vntGroup = .Offset(, clngGroup).Resize(lngRows + 1).Value
    'B列データを配列に取得
    vntItems = .Resize(lngRows + 1).Value
  End With
  
  '注目値の位置を記録
  lngTop = 1
  'データ行数のカウント初期値
  lngCount = 1
  '結果用変数に初期値代入
  vntResult = vntItems(1, 1)
  For i = 2 To lngRows + 1
    '注目値と現在値が違った場合
    If vntGroup(lngTop, 1) <> vntGroup(i, 1) Then
      'データを転記
      rngList.Offset(lngTop - 1, clngColumns - 2) _
            .Resize(lngCount).Value = vntResult
      '結果用変数に初期値代入
      vntResult = vntItems(i, 1)
      '注目値の位置を記録
      lngTop = i
      'データ行数のカウント初期値に
      lngCount = 1
    Else
      '結果用変数に「・」を挟んで追加
      vntResult = vntResult & "・" & vntItems(i, 1)
      'データ行数のカウントを更新
      lngCount = lngCount + 1
    End If
  Next i

  With rngList
    '元データを復帰
    DataSort .Resize(lngRows, clngColumns + 1), .Offset(1, clngColumns)
    '復帰用Key列を削除
    .Offset(, clngColumns).EntireColumn.Delete
  End With
   
  strProm = "処理が完了しました"
   
Wayout:

  '画面更新を再開
  Application.ScreenUpdating = True
   
  Set rngList = Nothing
   
  MsgBox strProm, vbInformation
     
End Sub

Private Sub DataSort(rngScope As Range, _
          rngKey As Range, _
          Optional lngOrientation As Long = xlTopToBottom)

  rngScope.Sort _
      Key1:=rngKey, Order1:=xlAscending, _
      Header:=xlNo, OrderCustom:=1, MatchCase:=False, _
      Orientation:=lngOrientation, SortMethod:=xlStroke

End Sub
0 hits

【41582】縦セル内の文字を合成したいのです。 くじら 06/8/14(月) 23:18 質問
【41584】Re:縦セル内の文字を合成したいのです。 かみちゃん 06/8/14(月) 23:50 発言
【41590】Re:縦セル内の文字を合成したいのです。 くじら 06/8/15(火) 9:03 回答
【41587】Re:縦セル内の文字を合成したいのです。 ponpon 06/8/15(火) 0:34 発言
【41591】Re:縦セル内の文字を合成したいのです。 くじら 06/8/15(火) 9:22 回答
【41593】Re:縦セル内の文字を合成したいのです。 へっぽこ 06/8/15(火) 12:18 発言
【41595】Re:縦セル内の文字を合成したいのです。 くじら 06/8/15(火) 13:57 お礼
【41592】Re:縦セル内の文字を合成したいのです。 Hirofumi 06/8/15(火) 12:11 回答
【41594】Re:縦セル内の文字を合成したいのです。 Hirofumi 06/8/15(火) 13:11 回答
【41596】Re:縦セル内の文字を合成したいのです。 くじら 06/8/15(火) 13:59 お礼

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