はじめて質問させていただきます。よろしくお願いいたします。
【やりたいこと】
①C1セルで管轄を絞り、該当以外を非表示にする ←一応できていること
②E1のキーワードで列を取得し、該当の列から空欄行を非表示にする ←できていないこと
例)「特別な周知」を選んだ場合、社長・専務・部長だけが表示されている状態にする
③抽出されたメールアドレスだけを、コピーした状態にする ←一応できていること
「特別な周知」「一般周知」「依頼」により、メールを送る相手が異なるので、その条件にあった方だけを表示し、アドレスをコピーしたいという内容になります。
リストが数百人に及ぶため、VBAで抽出できないかと考えております。
①については、以下のコードで一応ソートはかけられてます。
Sub ソート()
Rows.Hidden = False
Application.ScreenUpdating = False
Dim Ws As Worksheet
Set Ws = Worksheets("Sheet1")
Dim Cmax As Long
Cmax = Ws.Range("A65536").End(xlUp).Row
Dim keyWord As String
keyWord = Range("C1")
Dim i As Long
Dim Kankatsu As String
For i = 4 To Cmax
Kankatsu = Ws.Range("B" & i).Value
If InStr(Kankatsu, keyWord) > 0 Then
Else
Rows(i).Hidden = True
End If
Next
Application.ScreenUpdating = True
End Sub
②については、列の取得はできるもののそこから空欄を非表示にすることが出来ません。
Sub 指定した文字列の列を取得()
Dim key As Long
key = Rows(6).Find(Range("I2")).Column
End Sub
③については、表示されているアドレスだけをコピーできてます。
Sub アドレスコピー()
Dim endRow As Long
endRow = Cells(Rows.Count, 4).End(xlUp).Row
Range(Cells(4, 4), Cells(endRow, 4)).Copy
MsgBox "アドレスをコピーしました。"
End Sub
最終的に、①管轄でソート→②項目列を選択し空欄を非表示→③メールアドレスをコピーを[抽出]ボタン一つで出来るようにしたいと思っております。(画像3枚目)
何卒、よろしくお願いいたします。
No.3ベストアンサー
- 回答日時:
やはり記録マクロを使いフィルタで処理するのが簡単かと
実際に記録して試してください
範囲を選択する時はショートカットキー Ctrl+Shift+*で
記録を少しまとめ②を追加するとこんな感じ・・
Sub Macro1test()
'
' Macro1 Macro
'
Dim objColm As Range
Dim colm2 As Long
Set objColm = Rows(3).Find(Range("E1").Text) '②の検索
'Findの使い方はもう少し丁寧にするべきですがとりあえず
If Not objColm Is Nothing Then 'Findのエラーを回避する為
colm2 = objColm.Column '②の列№
Else
MsgBox "列が見つかりません": Exit Sub
End If
With Range("A3").CurrentRegion 'データ範囲
.AutoFilter
.AutoFilter Field:=2, Criteria1:=Range("C1").Text '①
.AutoFilter Field:=colm2, Criteria1:="<>" '②
.Columns(4).Offset(1).Copy Sheets("Sheet2").Range("A1") '③
.AutoFilter
End With
End Sub
gボタン押されたようなのでつい書いてしまったけれど、記録と見比べて検証してみてください
Offset(1)だけなので少し問題が残るかも知れません・・
Qchan1962様
二回もご回答ありがとうとございました。
>Range(Cells(4, 4), Cells(endRow, 4)).Copy
D列のみコピーで先は?
→アドレスをコピー後は、OutlookのToに張り付けるため、コピー状態で完了という流れを想定しておりました。
ご助言の通り、何度かマクロを記録してみましたが、一発で該当するものだけを表示するのは難しいということがわかりました。
大変勉強になりました。
二回のご回答をいただいた、Qchan1962様をベストアンサーに選ばせていただきます。
ありがとうございました。
No.2
- 回答日時:
こんばんは
各行を判断して非表示にしているようですが、同じ非表示にすれば良いだけなら、エクセルのフィルター機能を利用したほうが簡単ではないでしょうか?
コピーはできるとのことですので、以下は、フィルターで抽出するだけのサンプルです。
>例)「特別な周知」を選んだ場合、社長・専務・部長だけが表示~
とのことですが、東京の場合は「○」のある課長も抽出されてよいものと勝手に解釈しました。
>以下のコードで一応ソートはかけられてます。
ご質問文には「ソート」と書いてありますが、ソートは行っていないようなので、抽出処理のみを行っています。
Sub Q_13197135()
Dim r As Range, c As Range, col As Long
With Worksheets("Sheet1")
.Cells(3, 1).AutoFilter
Set r = Range(.Cells(3, 1), .Cells(Rows.Count, 1).End(xlUp)).Resize(, 8)
If r(1).Row < 3 Then Exit Sub
For Each c In .Range("F3:H3")
If c.Value = .Cells(1, 4).Value Then col = c.Column
Next c
If col < 6 Then col = 2
r.AutoFilter col, "<>"
r.AutoFilter 2, .Cells(1, 2).Text
End With
End Sub
fujillin様
ご回答ありがとうございました。
各行を判断して非表示にしているようですが、同じ非表示にすれば良いだけなら、エクセルのフィルター機能を利用したほうが簡単ではないでしょうか?
→大変おっしゃる通りなのですが、実際のExcelは、A~M列に社名・担当者名・住所等の情報があり、項目(特別な周知・一般周知等)はN~X列に分類されております。そのため右へのスクロールが大変煩わしくなったためご質問するに至りました。
ウィンドウ枠の固定も行ってはいるものの、情報量が多いのであまり効果的ではなく、では項目(特別な周知・一般周知等)をA列側に移動すればいいのではと修正したのですが、今度は項目のフラグが付けずらい等の意見が上がり断念した次第です。社名、担当者名、役職の列があって項目がある方が、フラグ付けがしやすいという意見です。
お二人からいただいた内容を、自分なりに理解し利用させていただきたいと思います。
この度は、大変ありがとうございました。
No.1
- 回答日時:
こんばんは
多分・・記録マクロでフィルタ操作を記録して・・少し改修
SpecialCells(xlCellTypeVisible)などを使って③を実行するのが良いかな?
多分これが簡単です
Hiddenで非表示にするとSpecialCellsが使えなかった気がしますしね
>Range(Cells(4, 4), Cells(endRow, 4)).Copy
D列のみコピーで先は?
①②で非表示にすると言う事は2つの条件がTrueの場合に
Rows(i).Hidden = True とするべきなのかな・・と言う事は分けて実行せずに2つの条件をAndにすれば良さそう・・・
フィルタでないやり方を試してみます(すみません元コードを見ていたら混乱してきたので書き替えて)
Functionで条件を投げて
非表示処理と非表示にならない範囲(この場合D列)を作成して戻します
Worksheets("Sheet2").Range("A1")にペースト
Sub test01()
Dim Ws As Worksheet
Set Ws = Worksheets("Sheet1")
Ws.Rows.Hidden = False
Dim keyWord(0 To 1) As String
Dim colm(0 To 1) As Long
keyWord(0) = Range("C1")
colm(0) = 2 'B列
Dim Rng As Range
Dim objColm As Range
Set objColm = Rows(3).Find(Range("E1").Text)
If Not objColm Is Nothing Then
colm(1) = objColm.Column
keyWord(1) = "〇" '〇は文字種があります
Set Rng = rowsHidden(keyWord, colm)
Else
MsgBox "列が見つかりません": Exit Sub
End If
'アドレスコピー
If Not Rng Is Nothing Then
Rng.Copy Worksheets("Sheet2").Range("A1")
Else
MsgBox "該当データがありません"
End If
Ws.Rows.Hidden = False
End Sub
Function rowsHidden(keyWord() As String, colm() As Long) As Range
Dim Rng As Range
Dim i As Long
For i = 4 To Cells(Rows.Count, 1).End(xlUp).Row
If InStr(Cells(i, colm(0)).Value, keyWord(0)) > 0 _
And InStr(Cells(i, colm(1)).Value, keyWord(1)) > 0 Then
Rows(i).Hidden = False '解除済みなので不要?
If Rng Is Nothing Then
Set Rng = Cells(i, "D")
Else
Set Rng = Union(Rng, Cells(i, "D"))
End If
Else
Rows(i).Hidden = True
End If
Next
Set rowsHidden = Rng
End Function
・・・やっぱりフィルターを使った方が良いと思います
その方が記録も出来るし分かりやすいかと・・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムについて。
-
DataTableに入っているデータを...
-
Ctrl + Cなど複数の入力キー...
-
Eclipseのコード入力時の、行コ...
-
Access VBAから使用したExcelプ...
-
マウントしたディスクにcpで、...
-
Activesheet.Pasteで困っています
-
エクセルVBA 実行時エラー'...
-
arduino unoからデータを読み出...
-
C++言語で、構造体のコピーは可...
-
Excelでコピーしたセル(テキス...
-
Listviewに表示された文字のコ...
-
Subversionで作業一段落の作業...
-
バッチで当日日付で作成される...
-
文字列の切り出し
-
一行おきに貼り付ける 可能でし...
-
EPROM Writer の使い方がわから...
-
VBA 最終行・最終列コピー範囲...
-
VBAのコピーマクロがデバッグに...
-
Windows上のマウス操作をプログ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access VBAから使用したExcelプ...
-
C++言語で、構造体のコピーは可...
-
DataTableに入っているデータを...
-
マウントしたディスクにcpで、...
-
エクセルVBA 実行時エラー'...
-
gitってなんですか?
-
Listviewに表示された文字のコ...
-
arduino unoからデータを読み出...
-
一行おきに貼り付ける 可能でし...
-
Ctrl + Cなど複数の入力キー...
-
Activesheet.Pasteで困っています
-
Eclipseのコード入力時の、行コ...
-
ブラウザからコピペすると文字...
-
シートに張り付けたボタンがシ...
-
ROBOCOPYをスペース付きのフォ...
-
文字列の切り出し
-
Eclipseでコピーするとき行数な...
-
【UWSC】WEBページ内コピーした...
-
jakarta poiを使用し、EXCELの...
-
バッチで当日日付で作成される...
おすすめ情報