[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『一覧表の編集方法』(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
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.