Excel VBA質問箱 IV

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

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


2370 / 13646 ツリー ←次へ | 前へ→

【68444】或るセルの値を他のセルの値にくっつけるには にしもり 11/3/8(火) 16:54 質問[未読]
【68446】Re:或るセルの値を他のセルの値にくっつけ... kanabun 11/3/8(火) 17:22 発言[未読]
【68450】Re:或るセルの値を他のセルの値にくっつけ... にしもり 11/3/8(火) 17:53 お礼[未読]

【68444】或るセルの値を他のセルの値にくっつける...
質問  にしもり  - 11/3/8(火) 16:54 -

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

下記のシートがあります

 A  B  C   D  E  F  G  H  I  J  K  L  M
1 #  Date METHOD PROD PROF Case DTL Byr Name ADDR INQ ANS OPN
 ===|====|======|====|====|====|===|====|====|====|===|===|====
2 111 0301 PHONE CD  S  HARD A  Cons John TYO xxx aaa NONE
3 111 0301 PHONE CD  S  SOFT B  Cons John TYO yyy bbb NONE
4 112 0301 PHONE DVD M  HARD A  WS  Tom OSA zzz ccc NONE


やりたいことは、、
まずNレコード目とN+1レコード目の#を比べ同じかをみます。(上記では#111が2個あります。)
同じだったらCase列の値を同一セルに格納します。(#111の場合、"F2"を「HARD vbLf SOFT」にします)
また、DTL列の値を同一セルに格納します。(#111の場合、"G2"を「A vbLf B」にします)
そして(この場合、)3行目をDELETEします。
なお、同じ#は2個とは限りませんが#昇順になっています。

以下わたしなりにかんがえました。
(1)最下端の行数を得る。
(2)カレントリージョンを選択する。(必要ない?)
(3)アクティブセルの値が、そのアクティブセル直下のセルの値と同じなら、WrkCountに蓄える。
(4)同じ#は2個とは限らないので改行マークをはさんでwrkRangeに追加します(が、これでは前に書いたものを上書きしてしまいますよね)

ここまででGIVEUPです。この先どうすればいいかどなたかアドバイスくださいませんか。


Public Sub test()

Dim i As Long
Dim n As Long
Dim WrkRow As Long
Dim WrkRange As Range
Dim WrkCount As Long

  With Sheets("Sheet1")
    WrkRow = .Cells(Rows.Count, 1).End(xlUp).Row '・・・(1)
  End With
  
  Range("A1").CurrentRegion.Select '・・・(2)

  n = 1
  For i = 2 To WrkRow
    If Value.ActiveCell(1, i) = Value.ActiveCell(1, i + 1) Then '・・・(3)
      n = n + 1
      WrkCount = n
    Else
      For n = WrkCount To 0
        Value.WrkRange = Chr(10) & Value.WrkRange(6, n) '・・・(4)
        Next n
      n = 1
    End If
  Next i
  
End Sub

【68446】Re:或るセルの値を他のセルの値にくっつ...
発言  kanabun  - 11/3/8(火) 17:22 -

引用なし
パスワード
   ▼にしもり さん:
>まずNレコード目とN+1レコード目の#を比べ同じかをみます。(上記では#111が2個あります。)
>同じだったら
>そして(この場合、)3行目をDELETEします。
>なお、同じ#は2個とは限りませんが#昇順になっています。

行削除は下からやるのが定石です。
そして、1行化作業は シート上でやると思い処理になるので、
配列とかでやったほうが効率いいと思います。
以下は、非表示ComboBox1のリスト内で (重複)行削除するものです

Sub Try1()
 Dim r As Range
 Dim v
 Dim i As Long
  Set r = Sheets(1).Cells(1).CurrentRegion
  v = r.Value
  With CreateObject("Forms.ComboBox.1")
    .List = v
    For i = .ListCount - 1 To 2 Step -1
      If .List(i, 0) = .List(i - 1, 0) Then
        .List(i - 1, 5) = .List(i - 1, 5) & vbLf & .List(i, 5)
        .List(i - 1, 6) = .List(i - 1, 6) & vbLf & .List(i, 6)
        .RemoveItem i
      End If
    Next
    r.ClearContents
    r.Resize(.ListCount, 13).Value = .List
  End With
  Beep
End Sub

【68450】Re:或るセルの値を他のセルの値にくっつ...
お礼  にしもり  - 11/3/8(火) 17:53 -

引用なし
パスワード
   ▼kanabun さん:
ありがとうございます。
大大感謝です。

1行化は下から削除、COMBOBOXを使う・・等、
思いもしませんでした。

それにしても回答者の皆様方と小生の実力差は如何ともし難く・・。

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