- ベストアンサー
ExcelVBA複数条件に一致する値を検索して該当する欄へ表示する方法
- ExcelVBAを使用して、複数の条件に一致する値を検索し、その値が該当する欄に表示する方法について教えてください。
- ExcelVBAを使って、氏名No.が一致し、かつ時給が適応される期間内の日付勤務に時給を自動で入力する方法について教えてください。
- Excelの配列数式では処理が重く、エクセルが重くなるため、マクロを使用して効率的に処理する方法について知りたいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
Sub 時給設定() Dim 左シート As Worksheet Dim 右シート As Worksheet Dim 左行 As Long Dim 右行 As Long Dim 初行 As Long Dim 氏名 Dim 範囲 As Range Dim 検出 As Range Dim 対象日 Set 左シート = ThisWorkbook.Worksheets(1) Set 右シート = ThisWorkbook.Worksheets(2) 右行 = 1 Do 右行 = 右行 + 1 氏名 = 右シート.Cells(右行, 5) 右シート.Cells(右行, 29) = "" If 氏名 = "" Then Exit Do '★氏名Noが空欄なら終了 Set 範囲 = 左シート.Columns("A:A") Set 検出 = 範囲.Find(氏名) If Not (検出 Is Nothing) Then 初行 = 検出.Row 対象日 = 右シート.Cells(右行, 3) Do 左行 = 検出.Row If 左シート.Cells(左行, 2) <= 対象日 And _ 左シート.Cells(左行, 3) >= 対象日 Then 右シート.Cells(右行, 29) = 左シート.Cells(左行, 4) Exit Do End If Set 検出 = 範囲.FindNext(検出) If 検出.Row = 初行 Then Exit Do Loop End If Loop End Sub このような感じです。
その他の回答 (3)
- nda23
- ベストアンサー率54% (777/1415)
>データ型が空欄 この場合はVariant型になります。 厳密に定義しても良かったのですが、 横着しました。 もっと言うと、全ての変数で型の 定義を省略しても稼動します。
お礼
横着しただけだったんですね(^^) データ型は省略しても稼動しますが、必ず宣言しましょう。と参考書には書かれていたものですから、気にし過ぎてしましました。 nda23さんのマクロは右行とか氏名とか、日本語で定義とか変数を書いてもらったので、すごくよく分かりました! 参考書ではたいがい英単語の省略とか、変数はiとかjがよく使われていました。私のような初心者にはぱっと見た感じではプロパティやメソッドと混ざり合って、何がなにやら分からなくなってしまうのですが、名付けたものが日本語だとこんなにも分かりやすくなるんですね。変数など日本語でも可とされているのですから、無理に英単語やアルファベットを使おうと思わず、日本語で作ってみようと思います☆ 本当にありがとうございました!
- nda23
- ベストアンサー率54% (777/1415)
画像が小さくてよく見えないので確認します。 左のシート A列:氏名No B列:始 C列:終 D列:時給 右のシート C列:出勤日 D列:曜日 E列: ?("x店No"のように見える) AC列:時給 >氏名Noが一致 左のシートのA列の項目で、右のシートのどの列を 検索するのでしょう?
補足
ありがとうございます。すみません。 右のシート C列:出勤日 ←左のシートB列、C列期間内かどうか E列:氏名No.←左のシートA列氏名Noと一致するかどうか 上記全て一致で、右のシートAC列に左のシートのD列:時給を表示させる。 というようにしたいのです。
- imogasi
- ベストアンサー率27% (4737/17069)
確かにVBA解説書を1・2冊買ってきて一読すれば、自分の思うプログラムが組めるなんてとんでもない。 特に独習でやる場合は1年そこらは直ぐ経って、そのうち情況が変わり、ニーズが過ぎ去って、エクセルやVBAなど忘れてしまう人が多いのではないかと思う。 ーー 質問コーナーの回答を丸写しして使っても勉強にならない。 次のヒントを元に自分で勉強するほうが良い。 ーー 学習的に難しい点(本に載ってないとかということ)は (1)他ブックのあるシートのセルに値を代入するかき方 その場合その他ブックは開いておくことが基本。 Googleで「VBA 他ブック参照」で照会してきると良い。 http://www.officepro.jp/excelvba/if/index3.html の Set B = ThisWorkbook Set C = ActiveSheet のようなSetの使いかた。 例 Sub test01() Set wb2 = Workbooks.Open("XXXX.xls") 'XXXXは同じフォルダに在る実在するブック指定 Set sh2 = wb1.Worksheets("Sheet1") 'XXXXブックに」在るSheet1.実在するシート名に変更 MsgBox sh1.Range("A1") End Sub でA1セルの値が取れるかどうか、納得してみたら。 また sh1.Range("A1")="あああ"に変えてみて実行し、セルA1があああになることを納得してみたら。 要は、ブックレベルからもうひとつのブック(VBAプロを入れている)のシートなどと区別した書き方に徹すること。単独ブック・単独シートを扱う場合のアクチブシートといった、デフォルト(書かなくても補って解釈してくれる機能)が効かないということ。 Set のほかにWitn も似たような働きをさせられるので、本件の後、将来勉強のこと。 (2)>複数条件に一致する値を検索して 元データのあるシートで、For Nextで行ポインターを1つづつ増やして全行を読んでいく。 その際その行のその項目が指定の値に一致するかはIF文で聞けば良い。 複数あるようだから、AND(またはOr)で結べばよい。 こんなところへ質問を出す前に、Googleででも「VBA 複数条件」で照会すること。 http://www.officepro.jp/excelvba/if/index3.html ほか、沢山説明が出てくる。 こちらは解説書にもあるだろう。 ーー データ全行を1行づつ対象にして、該当するかどうかを、IF文で判別し 該当すれば、他ブックのシートにかかい出す(値を代入) その際書き出すシートの行を示す行ポインター変数を設け、A列の場合、Sh2.Cells(j,"A")=・・などのjを(該当が1件あるごとに)1づつ増やしていく(j=j+1)。 項目が複数あれば、Sh2.Cells(j,"A")のAをB,C・・に変えて複数行だけ書き連ねる。=の右辺は元シートの対応行=Sh1.Cells(i,”B")などを指定することになる。
お礼
Googleで検索は、本を購入する前にかなり時間をかけて試みましたが、やはり時間をかけて習得する方が良いですよね。ありがとうございました。
お礼
ありがとうございます!!理想の通りになりました! 1つ質問なのですが、氏名と対象日のデータ型が空欄なのは何か意味ありでしょうか? 私の初級の初級の知識では、氏名は前ゼロがある数字の羅列で計算なんかには使わないので 文字列のStringで、対象日は日付だからDateで良いでしょうか? 参考書を見て、作っていただいたコードを飲み込めるように頑張ります! 本当にありがとうございました☆