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

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

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

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

コンボボックス

GUIの要素のひとつです。Listboxと同様にいくつかのうちひとつを選択する機能だが、Comboboxの場合は選択されたもののみがデフォルトとして表示される。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

解決済

1回答

1792閲覧

ExcelVBAでコンボボックス内の日付をFindメソッドにて検索したい。

Apoll047

総合スコア12

VBA

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

コンボボックス

GUIの要素のひとつです。Listboxと同様にいくつかのうちひとつを選択する機能だが、Comboboxの場合は選択されたもののみがデフォルトとして表示される。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2020/05/26 13:59

以前コード全体のことについて質問させていただいたものです。依然解決していません。今回はその中でもFindメソッドについてです。

ーーー希望の作動ーーーーーー
UserForm3にあるComboBox1内の日付を選択→CommandBotton1をトリガに別シートのE列にある様々な日付から同様(複数)の日付の行のみを取得したい
コンボボックスの内の日付は関数を用い第N週の木曜日を表示させてます。
関数参考サイト→https://vba-labo.rs-techdev.com/archives/170
以下コードには検索用のコード、日付をコンボボックスに追加するコードを記入します。
初心者なものでどこがいけないのかがわかりません。
このコードを実行すると必ずnothingの結果になってしまいます。(星マークのところ)
単純に検索結果が一致してないことが原因だと思います。しかし何をどうすればいいかがわかりません。いろいろ試しましたが日付のシリアル値、テキスト、値等どれでもヒットしないのです。
検索先の別シートのE列にはカスタム書式yyyy/mm/ddが入っています。
ご教授のほどよろしくお願いします。

ExcelVBA

1'検索用のコード 2Private Sub CommandButton1_Click() 3 4Dim S2 As Workshhet 5 Set S2 = Worksheets("2") 6 7 Dim LastRowY As Long 8 LastRowY = S2.Cells(Rows.Count, 1).End(xlUp).Row 9 10 Dim myRange As Range 11 Dim myObj As Range 12 Dim KeyDate As Date 13 14    Set myRange = S2.Range(S2.Cells(2, 5),S2.Cells(LastRowY, 5)) 15 KeyDate = CDate(UserForm3.ComboBox1) 16 Set myObj = myRange.Find(What:=KeyDate, LookIn:=xlFormulas) 17 18   If myObj Is Nothing Or ComboBox1 = "" Then 19     **MsgBox ComboBox1 & "はいません。"** 20    Exit Sub 21 Else 22 DeBug.Print myObj 23 End If 24End Sub 25 26'コンボボックス内の日付の追加(第1週、第4週木曜日の日付を表示。カスタム関数については参考サイト参照) 27 28Private Sub UserForm _Initialize() 29With ComboBox1 30 Dim i As Long 31 Dim m As Date 32 Dim y As Date 33 m = month(Date) 34 y = year(Date) 35 36 Dim x As Date 37 Dim z As Date 38 Dim a As Date 39 x = DateSerial(y, m, Day(Date)) 40 z = getDateWeekNum(y, m, vbThrusday,1)'カスタム関数第1週木曜日 41      a = getDateWeekNum(y, m, vbThrusday,4)'カスタム関数第4週木曜日 42 43 44If CDate(x) <= CDate(z) Then 45 For i = 0 To 12 46 .AddItem getDateWeekNum(y, m + i, vbThrusday,1) 47 .AddItem getDateWeekNum(y, m + i, vbThrusday,4) 48 Next 49 50ElseIf CDate(x) > CDate(Z) And CDate(x) <= CDate(a) Then 51 For i = 0 To 12 52 .AddItem getDateWeekNum(y, m + i, vbThrusday,1) 53 .AddItem getDateWeekNum(y, m + i + 1, vbThrusday,4) 54 Next 55 56Else 57 For i = 0 To 12 58 .AddItem getDateWeekNum(y, m + i + 1, vbThrusday,1) 59 .AddItem getDateWeekNum(y, m + i + 1, vbThrusday,4) 60 Next 61End If 62End With 63End Sub

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

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

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

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

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

meg_

2020/05/26 15:35

LookIn:=xlFormulasのxlFormulasをxlValuesに変えたらどうなりますか?
Apoll047

2020/05/26 15:36

オブジェクトが見つかりませんとのエラーが出ます。
Apoll047

2020/05/26 16:06

失礼しました。 オブジェクトではなく インデックスが有効範囲にありません。 9 がでます。 以上修正いたします。
meg_

2020/05/27 02:27

そのエラーはどこで(どの行で)発生しましたか?
guest

回答1

0

ベストアンサー

いろいろ試しましたが日付のシリアル値、テキスト、値等どれでもヒットしないのです。

※注意点
1)コンボボックスの値は文字列(String型)です。
2)FindメソッドのLookInにxlValuesを指定したら、「表示されている文字列」を検索します。

なので、「日付」を検索したいなら、文字列の表示形式を同じにしないと、同じ日付を検索できません。

※値で
値で検索しようと思ったことはないですが、
LookInにxlFormulasを指定して、日付を示す文字列をシリアル値に変換したら、できるかも?
試してみる価値はありそう?(試してみる元気はないけども^^;)

Findメソッドで日付を検索するとこういうトラブルが多いです。
(同様の回答をここ1~2ヶ月で3件目かと思います)
ワークシート上の関数、「Match関数」で検索すると、「セルの値」で検索できるので、
トラブルが少ないです。

同様(複数)の日付の行のみを取得したい

複数の結果を得たいなら、オートフィルター等のフィルター機能で検索すると、
VBAでループ処理を書かなくてもよくなります。
この際にも、単純にキーワードを指定すると、「文字列」で検索するので注意が必要になります。
しかし、これはまた別の話。

ExcelVBA

1Option Explicit 2 3Dim mrngTable As Range 4 5Private Sub UserForm_Initialize() 6 Me.CommandButton1.Enabled = False 7 Me.ComboBox1.List = GetItem(Date) 8 Set mrngTable = Worksheets(2).Cells(1).CurrentRegion 9End Sub 10 11Private Sub ComboBox1_Change() 12 Me.CommandButton1.Enabled = Me.ComboBox1.ListIndex + 1 13End Sub 14 15Private Sub CommandButton1_Click() 16 Dim sKey As String 17 Dim rngFind As Range 18 19 sKey = Me.ComboBox1.Text 20 If Len(sKey) Then 21 With mrngTable.Columns("E").Cells 22 Set rngFind = .Find(sKey, .Item(.Count), xlValues, xlWhole) 23 End With 24 If rngFind Is Nothing Then 25 MsgBox "ありません。" 26 Else 27 Application.Goto rngFind 28 End If 29 End If 30End Sub 31 32Function GetItem(ByVal d As Date) As Variant 33 Dim n As Long 34 Dim i As Long 35 Dim v(1) As String 36 37 d = d + 7 - Weekday(d) + vbThursday 38 Do 39 Select Case (Day(d) + 6) \ 7 40 Case 1, 4 41 v(i) = Format(d, "yyyy/mm/dd") 42 i = i + 1 43 End Select 44 d = d + 7 45 Loop Until i > UBound(v) 46 GetItem = v 47End Function 48

投稿2020/05/27 00:40

mattuwan

総合スコア2163

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問