[[20170327190955]] 『一覧表の編集方法』(blue allow) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『一覧表の編集方法』(blue allow)

こんばんは。はじめまして。
エクセルについて、皆様のお知恵を頂きたく質問させて頂きます。

 A    B    C       D
100004 ●●● 池田泉州    ○○支店
100004 ●●● 三井住友    ○○支店
100004 ●●● 三菱東京UFJ ××支店
100004 ●●● 池田泉州    ××支店
100004 ●●● 三井住友信託  △△支店
100004 ●●● 池田泉州    △△支店
100004 ●●● 池田泉州    ◇◇支店
100004 ●●● 大阪北部    ◇◇支店
100004 ●●● 大阪北部    
100004 ●●● 北おおさか
100004 ●●● 北おおさか
100005 ▼▼▼ みなと
100005 ▼▼▼ みなと
100005 ▼▼▼ みなと
100005 ▼▼▼ 三井住友
100005 ▼▼▼ 三井住友
100005 ▼▼▼ 三井住友

上記の様に縦に並んでいるデータをAのNoごとに横に一覧表を作成する事は
可能でしょうか?色々悩んでやってみたものの上手くいかずに困っております。何か良い関数はございますでしょうか?
みなさま、よろしくお願い致します。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 関数でなくてVBAでの処理でも、いいですか?

 >AのNoごとに横に一覧表を作成

 どのようにしたいか、AのNoである「100004」の場合で説明してください。
 別シートに作成したいのですか?
 どの列、どの行が、はっきりわかる形で説明願います。

(マリオ) 2017/03/27(月) 19:39


マリオ様

ご返答ありがとうございます。
VBAでも大丈夫です。

 A B C D E F G
100004 ●●● 池田泉州 ○○支店 三井住友 ○○支店

     G            H          I
三菱東京UFJ ××支店 池田泉州
     J            K          L         M         N          O         P         Q         R  
 ××支店 三井住友信託 △△支店 池田泉州 △△支店 池田泉州 ◇◇支店 大阪北部 ◇◇支店

といった形で横にNoで同一のものを続けて表示をさせたいです。
シートについては、別シートでの作成を考えております。

よろしくお願い致します。
(blue allow) 2017/03/27(月) 19:52


  >blue allow さん

 ■手順
 (1)エクセルファイル(拡張子:xlsm)を新規作成
 (2)「Sheet1」「Sheet2」の2シートを作成
 (3)Module1を作成して、下記の「Postingプロシージャ」
    をコピペ
 (4)「Sheet1」に下記の例のように、転記元データを作成
 (5)「Sheet1」のデータは、A列をキーとして、
     ★並べ替えを済ませておく。
 (6)「Postingプロシージャ」を実行してください
 (7)「Sheet1」の転記元データが、下記のような場合は、
     転記先シート「Sheet2」は、下記のようになります。

 ★なお、「転記元データの最終行」は、Sheet1の「A列」で判定しています。

 〓〓〓〓〓
 Module1
 〓〓〓〓〓
 Option Explicit

 Sub Posting()
  Dim fr As Long, x As Variant
  Dim c As Long, k As Long, max As Long, i As Long

  With ThisWorkbook.Sheets("Sheet1")
       fr = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
       x = .Range("A1:D" & fr).Value
  End With

  ReDim y(1 To fr, 1 To 4): c = 1: k = 2: max = 4
  For i = 1 To fr - 1
      If k = 2 Then
         y(c, 1) = x(i, 1): y(c, 2) = x(i, 2)
      End If
      k = k + 2
      If k > max Then
         max = k
         ReDim Preserve y(1 To fr, 1 To max)
      End If
      y(c, k - 1) = x(i, 3): y(c, k) = x(i, 4)
      If x(i, 1) <> x(i + 1, 1) Then
         c = c + 1: k = 2
      End If
  Next i

  With ThisWorkbook.Sheets("Sheet2")
      .UsedRange.Clear
      .Range("A1").Resize(c - 1, UBound(y, 2)).Value = y
   .Cells.ColumnWidth = 2.13
      .UsedRange.Columns.AutoFit
  End With
 End Sub

 〓〓〓〓〓
 Sheet1
 〓〓〓〓〓

     |[A]   |[B]   |[C]           |[D]     
 [1] |100004|●●●|池田泉州      |○○支店
 [2] |100004|●●●|三井住友      |○○支店
 [3] |100004|●●●|三菱東京UFJ|××支店
 [4] |100004|●●●|池田泉州      |××支店
 [5] |100004|●●●|三井住友信託  |△△支店
 [6] |100004|●●●|池田泉州      |△△支店
 [7] |100004|●●●|池田泉州      |◇◇支店
 [8] |100004|●●●|大阪北部      |◇◇支店
 [9] |100004|●●●|大阪北部      |        
 [10]|100004|●●●|北おおさか    |        
 [11]|100004|●●●|北おおさか    |        
 [12]|100005|▼▼▼|みなと        |        
 [13]|100005|▼▼▼|みなと        |        
 [14]|100005|▼▼▼|みなと        |        
 [15]|100005|▼▼▼|三井住友      |        
 [16]|100005|▼▼▼|三井住友      |        
 [17]|100005|▼▼▼|三井住友      |        

 〓〓〓〓〓
 Sheet2
 〓〓〓〓〓

    |[A]   |[B]   
 [1]|100004|●●●
 [2]|100005|▼▼▼
 =============================================
    |[C]     |[D]     |[E]     |[F]     
 [1]|池田泉州|○○支店|三井住友|○○支店
 [2]|みなと  |        |みなと  |        
 =============================================
     |[G]           |[H]     |[I]     |[J]     
 [1]|三菱東京UFJ|××支店|池田泉州|××支店
 [2]|みなと        |        |三井住友|        
 =============================================
    |[K]         |[L]     |[M]     |[N]     
 [1]|三井住友信託|△△支店|池田泉州|△△支店
 [2]|三井住友    |        |三井住友|        
 =============================================
    |[O]     |[P]     |[Q]     |[R]     
 [1]|池田泉州|◇◇支店|大阪北部|◇◇支店
 [2]|        |        |        |        
 =============================================
    |[S]     |[T]|[U]       |[V]
 [1]|大阪北部|   |北おおさか|   
 [2]|        |   |          |   
 =============================================
    |[W]       |[X]
 [1]|北おおさか|   
 [2]|          |   
 =============================================

 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
 ・上記のVBAコードで、やりたいことは、すべて出来ていますか?
 ・「Sheet1」のD列が、「空白」のとき、「Sheet2」で、列を左に詰めますか?
 ・「Sheet2」の1行目に、タイトル行を設けますか?設けるとしたら、どんなタイトルにしますか?
 ・コードの解説は、いりませんか?

(マリオ) 2017/03/28(火) 08:49


マリオさん

おはようございます。
早速ありがとうございます!!
試してみます!

・「Sheet1」のD列が、「空白」のとき、「Sheet2」で、列を左に詰めますか?
⇒詰める形にしたいです。

・「Sheet2」の1行目に、タイトル行を設けますか?設けるとしたら、どんなタイトルにしますか?
⇒タイトルは無でいこうと考えております。

・コードの解説は、いりませんか?
⇒頂けますと大変助かります。

本当にいろいろとありがとうございます。
感謝致します。
(blue allow) 2017/03/28(火) 09:13


 「posting2」は、詰める形にしております。

 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
 'Sheet1のD列が、空白ならSheet2で列を詰めるバージョン

 Sub Posting2()
  Dim fr As Long, x As Variant
  Dim c As Long, k As Long, max As Long, i As Long

  With ThisWorkbook.Sheets("Sheet1")
      'Sheet1のA列最終行に、「1」を足した値をfrとする
       fr = .Cells(.Rows.Count, "A").End(xlUp).Row + 1 
      'Sheet1のセル範囲(2次元配列)をVariat型のxに格納
       x = .Range("A1:D" & fr).Value
  End With

 '--------------------------------------------
 '(1) Sheet2に書き込むデータ(2次元配列:y)
 '   1次元目のIndex番号(最大値)は、
 '   十分大きな値「fr」にしておく

 '(2) 2次元目のIndex番号は、仮に「1〜4」に設定し、
 '   後ほど、「ReDim Preserve」で、
 '   2次元目のIndex番号(最大値)を変更する

 '(3) 1次元目は、セルの「行」に対応したIndex番号
 '   2次元目は、セルの「列」に対応したIndex番号
 '   括弧内のカンマの左側が、1次元目(1 To fr)

 '(4) y配列は、Sheet2に書込み予定のデータである
 '    一方、x配列は、Sheet1の転記元データである

  ReDim y(1 To fr, 1 To 4)
  '--------------------------------------------

  c = 1   '初期値:y配列の1次元目(行)
  k = 2   '初期値
  max = 4 '初期値

  For i = 1 To fr - 1
     'k=2のときは、y配列で、3列目以降のデータが格納されて
     'いないときである。
      If k = 2 Then
          '右辺:Sheet2に記述するA列データ
          '左辺:Sheet1にA列にあるデータ
         y(c, 1) = x(i, 1)

          '右辺:Sheet2に記述するB列データ
          '左辺:Sheet1にB列にあるデータ
         y(c, 2) = x(i, 2)
      End If
     '------------------------------------------
      If Trim(x(i, 4)) = "" Then 'Sheet1のD列が空白なら
         k = k + 1 '列数を1つ増やす
      Else
         k = k + 2 '列数を2つ増やす
      End If

      If k > max Then 'kがmaxを越えたなら
         max = k'maxの値をkに変更する
         'y配列の2次元目のIndex番号(最大値)を変更する
         ReDim Preserve y(1 To fr, 1 To max)
      End If

      'Sheet1のD列が空白なら、x配列(右辺:Sheet1のデータ)
      'をy配列(左辺:Sheet2に書込み予定のデータ)に格納
      If Trim(x(i, 4)) = "" Then
         y(c, k) = x(i, 3) 'Sheet1のC列データのみを格納
      Else
         y(c, k - 1) = x(i, 3) 'Sheet1のC列データを格納
         y(c, k) = x(i, 4)     'Sheet1のD列データを格納
      End If
     '-------------------------------------------
      If x(i, 1) <> x(i + 1, 1) Then'Sheet1のA列の内容が異なるなら
         c = c + 1 'cに「1」を足す
         k = 2     'リセットする
      End If
  Next i

  With ThisWorkbook.Sheets("Sheet2")
      .UsedRange.Clear '使用セルのみ、、「値、書式」を削除
      'Sheet2に、2次元配列yのデータを書き込む
      .Range("A1").Resize(c - 1, UBound(y, 2)).Value = y
      .Cells.ColumnWidth = 2.13 'セルの幅を「2.13」にする
      .UsedRange.Columns.AutoFit 'セル幅を自動調整
  End With
 End Sub
 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

(マリオ) 2017/03/28(火) 10:23


Sub main()
    Dim c As Range, r As Range
    ActiveSheet.Copy after:=ActiveSheet
    Range("A1:B" & Rows.Count).RemoveDuplicates Columns:=Array(1, 2)
    Range("C:D").ClearContents
    For Each c In ActiveSheet.Previous.Range("A:A").Cells.SpecialCells(xlCellTypeConstants)
        Set r = Range("A:A").Find(c.Value, , xlValues, xlWhole)
        Cells(r.Row, Columns.Count).End(xlToLeft).Offset(, 1).Resize(, 2).Value = c.Offset(, 2).Resize(, 2).Value
    Next c
End Sub
(mm) 2017/03/28(火) 13:12

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.