質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

2回答

1030閲覧

Findメソッドで空白セルがヒットした場合空白セルをコピペしたい

GKHHKJ

総合スコア39

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2021/06/28 02:09

"組織図"シートから"Sheet1"シートに社員情報を転記するマクロを作成しています。
"課検索"マクロと”メンバー検索”マクロを作成しましたが、
課を"Sheet1"のA列にコピペしたあと、
メンバーをB列にコピペすると、
メンバーがいない課の隣に、次の行の課のメンバーがコピペされてしまいます。

どうしたら空白セルをコピペできるでしょうか。

Sub 課検索() Dim SearchRange As Range '検索範囲格納 Dim ResultRange As Range '検索結果格納 Dim StartRange As Range '検索行格納 Dim KeyItem As String Dim MsgStr As String Dim i As Long i = 1 Set SearchRange = Worksheets("組織図").Range("A:Z") '検索したいデータ範囲 KeyItem = "課" Set ResultRange = SearchRange.Find(KeyItem, LookAt:=xlPart) If Not ResultRange Is Nothing Then Set StartRange = ResultRange '最初に見つかったセルを格納しておく Do If InStr(ResultRange.Value, "課長") = 0 And InStr(ResultRange.Value, "課担当") = 0 Then ResultRange.Copy Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial (xlPasteValues) Application.CutCopyMode = False i = i + 1 End If Set ResultRange = SearchRange.FindNext(After:=ResultRange) '次の検索セルを指定する If ResultRange.Address = StartRange.Address Then '見つかったセルが最初のセルか判定 Exit Do '同じ場合はループを離脱 End If Loop End If End Sub
コード Sub メンバー検索() Dim SearchRange As Range '検索範囲格納 Dim ResultRange As Range '検索結果格納 Dim StartRange As Range '検索行格納 Dim KeyItem As String Dim MsgStr As String Dim i As Long i = 1 Set SearchRange = Worksheets("組織図").Range("A:Z") '検索したいデータ範囲 KeyItem = "課" Set ResultRange = SearchRange.Find(KeyItem, LookAt:=xlPart) If Not ResultRange Is Nothing Then Set StartRange = ResultRange.Offset(0, 1) '最初に見つかったセルを格納しておく Do If InStr(ResultRange.Value, "課長") = 0 And InStr(ResultRange.Value, "課担当") = 0 Then ResultRange.Offset(0, 1).Copy Worksheets("Sheet1").Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).PasteSpecial (xlPasteValues) Application.CutCopyMode = False i = i + 1 End If Set ResultRange = SearchRange.FindNext(After:=ResultRange) '次の検索セルを指定する If ResultRange.Offset(0, 1).Address = StartRange.Address Then '見つかったセルが最初のセルか判定 Exit Do '同じ場合はループを離脱 End If Loop End If End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Usirow

2021/06/28 04:04

ぱっと見る限り一つにまとめるだけで解決しそうだと思うんですけど、わざわざ課検索とメンバー検索とで二つに分けているのには何か理由があるんでしょうか?
GKHHKJ

2021/06/28 04:07

マクロ初心者なもので、まとめ方がわからないんです… よろしければ教えていただけますと幸いです
guest

回答2

0

課のメンバーがいないケースがあるようですが、メンバーが2名以上のケースはないのですか?

|A|B|C|D|E|F|G|
|:--|:--|:--|:--|:--|
||||
|すぐやる課|メンバー)山田||まあいい課|メンバー)白石||
|課長)田中|||課長)今野|メンバー)秋元||
||||
||||
||||


<追記>
多分こんな感じだと思う。

vba

1Sub 課検索() 2 3 Dim SearchRange As Range '検索範囲格納 4 Dim ResultRange As Range '検索結果格納 5 Dim StartRange As Range '検索行格納 6 Dim KeyItem As String 7 Dim MsgStr As String 8 Dim i As Long 9 10 11 Set SearchRange = Worksheets("組織図").Range("A:Z") '検索したいデータ範囲 12 13 KeyItem = "*課" 14 Set ResultRange = SearchRange.Find(What:=KeyItem, Lookat:=xlWhole) 15 If ResultRange Is Nothing Then Exit Sub 16 Set StartRange = ResultRange '最初に見つかったセルを格納しておく 17 18 19 Dim ws As Worksheet, outRange As Range 20 Set ws = Worksheets("Sheet1") 21 Set outRange = ws.Cells(ws.Rows.Count, 1).End(xlUp).Offset(1, 0) 22 23 24 Do 25 Dim kacho As Range, member As Range 26 Set kacho = ResultRange.Offset(1, 0) 27 Set member = ResultRange.Offset(0, 1) 28 i = 0 29 30 outRange.Value = kacho.Value 31 If member.Value = "" Then 32 Set outRange = outRange.Offset(1, 0) 33 Else 34 Do While member.Offset(i, 0).Value <> "" 35 outRange.Offset(i, 1).Value = member.Offset(i, 0).Value 36 i = i + 1 37 Loop 38 Set outRange = outRange.Offset(i, 0) 39 End If 40 41 Set ResultRange = SearchRange.FindNext(After:=ResultRange) '次の検索セルを指定する 42 43 If ResultRange.Address = StartRange.Address Then Exit Do '見つかったセルが最初のセルか判定 同じ場合はループを離脱 44 45 Loop 46 47 End Sub

投稿2021/06/28 05:08

編集2021/06/28 10:54
jinoji

総合スコア4592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GKHHKJ

2021/06/28 05:46

メンバー複数います!
jinoji

2021/06/28 06:08

メンバーが0名のとき、1名のとき、2名のとき、3名のとき、など それぞれの場合にどういう出力にしたいのかを、きちんとイメージしておいた方がいいと思います。 こんな感じなのでしょうか。 |田中|山田|  ・・・1名 |伊藤|__|  ・・・0名 |今野|白石|  ・・・2名 |__|秋元|
GKHHKJ

2021/06/28 08:38

そういう感じです!
guest

0

見た感じではこういうことだと思いました。

VBA

1'前略 2Do 3 If InStr(ResultRange.Value, "課長") = 0 And InStr(ResultRange.Value, "課担当") = 0 Then 4 5 ResultRange.Copy 6 Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial (xlPasteValues) 7 8 ResultRange.Offset(0, 1).Copy 9 Worksheets("Sheet1").Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).PasteSpecial (xlPasteValues) 10 11 Application.CutCopyMode = False 12 13 i = i + 1 14 15 End If 16 17 Set ResultRange = SearchRange.FindNext(After:=ResultRange) '次の検索セルを指定する 18 19 If ResultRange.Address = StartRange.Address Then '見つかったセルが最初のセルか判定 20 21 Exit Do '同じ場合はループを離脱 22 23 End If 24 25Loop

投稿2021/06/28 04:16

Usirow

総合スコア364

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GKHHKJ

2021/07/01 06:00

できませんでした…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問