
初めて質問させていただきます。
詳しい方、教えていただけませんでしょうか。
表示用シートのセルA1に営業部コードを入力すると、その営業部管下の支社所属社員の情報を、元データシートから抽出して、画像のように内容別の表へそれぞれ表示させるという仕組みを作りたいと思っています。
元データシートには、
営業部コード 支社名 社員名 入社年月 個人件数 個人金額 法人件数 法人金額 獲得P…
といった感じで、表示用シートの元になるデータを社員1人につき1行で全データを入力してあります。
営業部によって表示される人数(最低3名から最高30名)も違うので、オレンジ色の項目行の下は、抽出した件数によって自動で罫線のある行が追加され、内容が表示されるようにしたいです。
このようなマクロ・VBAの作成方法を教えてください。
会社ではExcel2010を使用しています。
宜しくお願いします。
※欲を言うと、A1の営業部コート入力後、隣に抽出ボタンを作ってそれを押すと抽出、さらに隣にクリアボタンを作って、それを押すと抽出したデータをクリアする、という風にできるとありがたいです。

A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
No.3です。
今度は各コマンドボタンのコードを載せてみます。
まず「抽出」用のコードは
Private Sub CommandButton1_Click()
Dim c As Range
If Range("A1") <> "" Then
Set c = Worksheets("元データ").Range("A:A").Find(what:=Range("A1"), LookIn:=xlValues, lookat:=xlWhole)
If Not c Is Nothing Then
Call 抽出
Else
MsgBox "該当データなし"
End If
End If
End Sub
次に「クリア用」のコード
Private Sub CommandButton2_Click()
Dim i As Long
Application.ScreenUpdating = False
For i = Cells(Rows.Count, "A").End(xlUp).Row To 3 Step -1
If Cells(i, "A") <> "" Then
If Cells(i, "A") <> "支社名" And InStr(Cells(i, "A"), "関連") = 0 Then
Cells(i, "A").EntireRow.Delete
End If
End If
Next i
Application.ScreenUpdating = True
End Sub
※ 「元データ」シートは1行目が項目行でデータは2行目以降にあるとしています。
※ コード内に項目名を入れていますので、
コードに記載している「項目」が「元データ」シートにあるというのが大前提です。
一発で解決!とはいかないと思いますが
まずはこの程度で・・・m(_ _)m
No.3
- 回答日時:
こんばんは!
まず標準モジュールに↓のコードをコピー&ペーストしてください。
Sub 抽出()
Dim i As Long, k As Long, myRow As Long, c As Range
Dim lastRow As Long, lastCol As Long, wS As Worksheet
Dim myAry1 As Variant, myAry2 As Variant
Set wS = Worksheets("元データ")
myAry1 = Array("成績関連", "キャンペーン関連", "取得資格関連")
Application.ScreenUpdating = False
With Worksheets("表示用")
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
If lastRow > 1 Then
lastCol = .UsedRange.Columns.Count
Range(.Cells(2, "A"), .Cells(lastRow, lastCol)).Clear
End If
lastRow = wS.Cells(Rows.Count, "A").End(xlUp).Row
wS.Range("A1").AutoFilter field:=1, Criteria1:=.Range("A1")
For i = 1 To 3
myRow = .Cells(Rows.Count, "A").End(xlUp).Row + 3 '←2行あける//
.Cells(myRow, "A").Resize(, 2).Merge
.Cells(myRow, "A") = myAry1(i - 1)
If wS.Cells(Rows.Count, "A").End(xlUp).Row > 1 Then
wS.Range("B1").Resize(, 3).Copy .Cells(myRow + 1, "A")
Range(wS.Cells(2, "B"), wS.Cells(lastRow, "D")).SpecialCells(xlCellTypeVisible).Copy
.Cells(myRow + 2, "A").PasteSpecial Paste:=xlPasteAll
Select Case i
Case 1: myAry2 = Array("個人件数", "個人金額", "法人件数", "法人金額")
For k = 0 To UBound(myAry2)
.Cells(myRow + 1, Columns.Count).End(xlToLeft).Offset(, 1) = myAry2(k)
Set c = wS.Rows(1).Find(what:=myAry2(k), LookIn:=xlValues, lookat:=xlWhole)
Range(wS.Cells(2, c.Column), wS.Cells(lastRow, c.Column)).SpecialCells(xlCellTypeVisible).Copy
.Cells(myRow + 2, Columns.Count).End(xlToLeft).Offset(, 1).PasteSpecial Paste:=xlPasteAll
Next k
.Cells(Rows.Count, "A").End(xlUp).CurrentRegion.Borders.LineStyle = xlContinuous
Case 2: myAry2 = Array("獲得P", "入賞まで残P")
For k = 0 To UBound(myAry2)
.Cells(myRow + 1, Columns.Count).End(xlToLeft).Offset(, 1) = myAry2(k)
Set c = wS.Rows(1).Find(what:=myAry2(k), LookIn:=xlValues, lookat:=xlWhole)
Range(wS.Cells(2, c.Column), wS.Cells(lastRow, c.Column)).SpecialCells(xlCellTypeVisible).Copy
.Cells(myRow + 2, Columns.Count).End(xlToLeft).Offset(, 1).PasteSpecial Paste:=xlPasteAll
Next k
.Cells(Rows.Count, "A").End(xlUp).CurrentRegion.Borders.LineStyle = xlContinuous
Case Else: myAry2 = Array("資格1", "資格2", "資格3", "資格4")
For k = 0 To UBound(myAry2)
.Cells(myRow + 1, Columns.Count).End(xlToLeft).Offset(, 1) = myAry2(k)
Set c = wS.Rows(1).Find(what:=myAry2(k), LookIn:=xlValues, lookat:=xlWhole)
Range(wS.Cells(2, c.Column), wS.Cells(lastRow, c.Column)).SpecialCells(xlCellTypeVisible).Copy
.Cells(myRow + 2, Columns.Count).End(xlToLeft).Offset(, 1).PasteSpecial Paste:=xlPasteAll
Next k
Cells(Rows.Count, "A").End(xlUp).CurrentRegion.Borders.LineStyle = xlContinuous
End Select
End If
Next i
wS.AutoFilterMode = False
.Columns.AutoFit
End With
Application.ScreenUpdating = True
MsgBox "完了"
End Sub
>隣に抽出ボタンを作ってそれを押すと抽出、さらに隣にクリアボタンを作って
とありますので、
「表示用」シートにコマンドボタンを二つ配置してのコードが必要だと思いますが、
文字制限数を超えそうなので
一旦ここまでで投稿します。m(_ _)m
No.2
- 回答日時:
>入力した営業部コードの抽出結果にあわせて、その都度行数を変化させて表示させたいのです
出来ないことはないですよ。VBAの力をかります。
そこで、考え方ですが。
最大に人数で項目を配置して、抽出を行って、不要な部分を非表示にしてしまう方が
作りやすいと思います。
しかし、抽出の結果で、項目の行が上下する表示は如何でしょうか?
結構、見づらいものになりそうな気がします。
成績関連、キャンペーン関連、資格関連で表示される項目が違うだけですよね。
一案ですが
C3セルに 成績関連、キャンペーン関連、資格関連 と選択できるように入力規則を設定して
先のアドバンスフィルターで全ての項目を表示させる。
その下に以下のコードを追加して
If Target.Address="$C$3" Then
IF Target.Value="成績関連" Then
Columns("A:H").EntireColumn.Hidden = False
Columns("F:H").EntireColumn.Hidden = True
End If
IF Target.Value="成績関連" Then
Columns("A:H").EntireColumn.Hidden = False
Columns("D:F").EntireColumn.Hidden = True
End If
・・・・
End If
必要な列が表示されたり、非表示になったりしたら
どうでしょうか。
No.1
- 回答日時:
昨日も同じような質問があったので
一例です。
A B C D E
1
2 営業部コード
3
4
5 支社名 社員名 入社年月 個人件数 個人金額
と項目名を張り付けてじゅんびします。
シートの名前のタブを右クリック
コードの表示をクリック
VBエディターが起動するので
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address="$A$3" Then
Sheets("元データ").Columns("A:H").AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Range("A2:A3"), CopyToRange:=Range("A5:E5"), Unique:=False
Endi If
End Sub
を張り付けて閉じる。
A3セルに コードを入力してEnterを押すだけで、ご希望のデータが抽出されます。
枠を付けたければ、条件付き書式で設定できます。
詳しくは、こちらの質問に書いておきました。
https://oshiete.goo.ne.jp/qa/8998094.html
早速教えていただきありがとうございます。
教えていただいた内容で実行してみたのですが、この内容だと成績関連のデータを抽出すると、データがそのまま表示されてしまい、次の表のキャンペーン関連の内容が表示できませんでした。
30人所属している営業部のコードをA1に入力したら、成績関連のデータを30行、1・2行あけてキャンペーン関連のデータを30行、1・2行あけて資格関連のデータを30行表示させ、A1のコードを消したら、抽出したデータもクリアされて成績・キャンペーン・資格の項目行だけが残る。5人所属している営業部のコードを入力したら、成績関連のデータを5行…
という風に、入力した営業部コードの抽出結果にあわせて、その都度行数を変化させて表示させたいのですが、難しいでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelマクロ 差分抽出の方法が知りたいです。 2 2023/03/07 13:25
- Excel(エクセル) Excel(エクセル)でフィルター抽出後、非表示の行を計算しないで、合計を算出する方法 【内容】 添 4 2023/01/30 17:17
- Excel(エクセル) Excelでのデータ管理 6 2022/12/24 09:33
- Visual Basic(VBA) エクセルについて教えてください。 3 2023/06/28 09:11
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Excel(エクセル) Excelマクロの差分抽出のコードを教えていただきたいです。 2 2023/03/14 11:40
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
- Excel(エクセル) マクロか関数で処理したいのですが、教えて頂けませんか。 8 2022/10/31 15:18
- Visual Basic(VBA) 顧客ごとに違う点検案内を作成するマクロ 4 2022/09/16 05:34
- Excel(エクセル) 【詳しい方教えて下さい】EXCEL条件に一致する値の複数抽出 9 2022/04/29 10:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
9月17日でサービス終了らし...
-
エクセル ドロップダウンリスト...
-
特定のセルだけ結果がおかしい...
-
エクセル
-
エクセルのdatedif関数を使って...
-
【マクロ】アクティブセルの時...
-
【関数】同じ関数なのに、エラ...
-
エクセルの循環参照、?
-
【マクロ】A列にある、日付(本...
-
【マクロ】3行に上から下に並...
-
【マクロ】EXCELで読込したCSV...
-
【マクロ】WEBシステムから保存...
-
iPhoneのExcelアプリで、別のシ...
-
【エクセル】期限アラートについて
-
Excelファイルを開くと私だけVA...
-
Excelの新しい空白のブックを開...
-
Excelについての質問です 並べ...
-
マクロ・VBAで、当該ファイルの...
-
VBA チェックボックスをオーバ...
-
派遣会社とかハローワークとか...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelファイルを開くと私だけVA...
-
エクセルについてどう関数を使...
-
マクロ・VBAで、当該ファイルの...
-
エクセルのセルに画像は埋め込...
-
エクセルで、一部のセルだけ固...
-
【マクロ、画像あり】A表かB表...
-
エクセルでカウントする
-
【マクロ】コードを少しでも、...
-
VBA_日時のソート
-
エクセルで教えてください。 例...
-
エクセル 月間シフト表で曜日ご...
-
セルの左に余白を付ける
-
エクセル
-
エクセルについて教えてください
-
2枚のエクセル表で数字をマッチ...
-
ExcelのIF関数との組み合わせの...
-
エクセルのファイルのコピーを...
-
エクセルで二つのブックの違い...
-
空白処理を空白に
-
Excelのチェックボックスについ...
おすすめ情報