Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1865 / 13645 ツリー ←次へ | 前へ→

【71412】日付の検索 AoYasu 12/3/1(木) 8:58 質問[未読]
【71413】Re:日付の検索 kanabun 12/3/1(木) 9:15 発言[未読]
【71415】Re:日付の検索 AoYasu 12/3/1(木) 10:49 質問[未読]
【71416】Re:日付の検索 AoYasu 12/3/1(木) 11:56 質問[未読]
【71417】Re:日付の検索 kanabun 12/3/1(木) 12:09 発言[未読]
【71419】Re:日付の検索 AoYasu 12/3/1(木) 12:42 質問[未読]
【71421】Re:日付の検索 kanabun 12/3/1(木) 13:00 発言[未読]
【71423】Re:日付の検索 AoYasu 12/3/1(木) 13:07 質問[未読]
【71425】Re:日付の検索 kanabun 12/3/1(木) 14:20 発言[未読]
【71426】Re:日付の検索 AoYasu 12/3/1(木) 15:49 質問[未読]
【71429】Re:日付の検索 kanabun 12/3/1(木) 19:58 発言[未読]
【71430】Re:日付の検索 AoYasu 12/3/1(木) 21:04 お礼[未読]
【71418】Re:日付の検索 kanabun 12/3/1(木) 12:17 発言[未読]
【71420】Re:日付の検索 AoYasu 12/3/1(木) 12:48 質問[未読]
【71422】Re:日付の検索 kanabun 12/3/1(木) 13:06 発言[未読]

【71412】日付の検索
質問  AoYasu  - 12/3/1(木) 8:58 -

引用なし
パスワード
   日付の検索について教えていただきたいのです

  納入日  場所  納入先  受注日  金額

  3月10日  神田  神田商店  2/9  \15000
  3月20日  神田  神田商店  2/15  \25000
のような表があります

 2/9 を検索しようとしていますが 検索されません 
 2/9を検索文字値としましたが抽出条件表には2月9日となっていました
 
 抽出条件表
  納入日  場所  納入先  受注日  金額
                2月9日
よろしくおねがいします
   Dim 検索文字 As String
   検索文字 =Userform.TextBox受注日 ---検索文字値 =2/9
  Set Ran = sht3.Range("B" & Mgyou).CurrentRegion
  Set Ran = Intersect(Ran, Ran.Offset(, 1))
  Ran.AdvancedFilter Action:=xlFilterCopy, _
  CriteriaRange:=sht2.Range("B" & Mgyou & ":" & "M" & Mgyou1), _
  CopyToRange:=sht1.Range("B" & WriteGyou), Unique:=False

【71413】Re:日付の検索
発言  kanabun  - 12/3/1(木) 9:15 -

引用なし
パスワード
   ▼AoYasu さん:
>日付の検索
>
>  納入日  場所  納入先  受注日  金額
>
>  3月10日  神田  神田商店  2/9  \15000
>  3月20日  神田  神田商店  2/15  \25000

> 2/9を検索文字値としましたが抽出条件表には2月9日となっていました

1.抽出範囲 Ran の先頭行には 列見出しが書いてありますか?
2. AdvancedFilterの CriteriaRangeは、1列2行で 1行目は「受注日」などの
  抽出したい列見出し、2行目は 日付シリアル値( 日付文字列ではだめです)
  が書き込まれてますか?
  逆に言えば、CriteriaRangeの2行目に書く日付けは 日付であれば
  セルの表示形式がどのようなものでも構いません。文字列ではだめです。

【71415】Re:日付の検索
質問  AoYasu  - 12/3/1(木) 10:49 -

引用なし
パスワード
   ▼kanabun さん:
  ご解答ありがとうございます
  すいません 基本的なことが解っていないようです

  抽出範囲 Ran の先頭行は以下のようにしました 

  Set Ran = sht3.Range("B" & Mgyou).CurrentRegion
  Set Ran = Intersect(Ran, Ran.Offset(, 1))
  Ran.AdvancedFilter Action:=xlFilterCopy, _
  CriteriaRange:=sht2.Range("B" & Mgyou & ":" & "M" & Mgyou1), _
  CopyToRange:=sht1.Range("B" & WriteGyou), Unique:=False

  抽出条件表

  納入日  場所  納入先  受注日  金額 -----見出し
                2月9日     ----2行目

  >>2行目は 日付シリアル値( 日付文字列ではだめです)
    2月9日となっています これは日付文字列と云うことでしょうか
    日付シリアル値にするには 2行目のセルの文字設定で”標準"
    に設定しておかないとダメでしょうか
    2月9日の日付シリアル値40948になるようにするのでしょうか

  >>2行目に書く日付けは 日付であれば
   セルの表示形式がどのようなものでも構いません。文字列ではだめです

    2/9で入力していますが 2行目には(2月9日)上記のようになります
    2行目のセル位置を書式設定を見ますと"ユーザー定義" "mm月dd日"
    なっています
  よろしくお願いします

【71416】Re:日付の検索
質問  AoYasu  - 12/3/1(木) 11:56 -

引用なし
パスワード
   ▼kanabun さん:
 検索表
   納入日  場所  納入先  受注日  金額
   3月10日  神田  神田商店  2/9  \15000
   3月20日  神田  神田商店  2/15  \25000

   調べましたら 受注日 2/9 は2007/2/9 で
   抽出条件の2列目を文字設定("G標準")して
   2/9 を入れますと2012/2/9 の日付シリアル値に
   なってしまいます
   この違いで検索されないのでしょうか
 度々ですいません
 よろしくお願いいたします

【71417】Re:日付の検索
発言  kanabun  - 12/3/1(木) 12:09 -

引用なし
パスワード
   ▼AoYasu さん:
>▼kanabun さん:
> 検索表
>   納入日  場所  納入先  受注日  金額
>   3月10日  神田  神田商店  2/9  \15000
>   3月20日  神田  神田商店  2/15  \25000
>
>   調べましたら 受注日 2/9 は2007/2/9 で
これをどうやって確認したのですか?
受注日の列で たとえば「2/9」と表示されているセルをクリックすると、
数式バーにはどのように表示されますか?

>   抽出条件の2列目を文字設定("G標準")して
>   2/9 を入れますと2012/2/9 の日付シリアル値に
>   なってしまいます
セルの表示形式がどのようになっていようと、「フィルタオプション」で
の抽出には影響ありません。セルの値がどうなっているかが重要です。
表のほうが日付型であれば、抽出条件も日付型に、
表のほうが(仮に)文字列なのであれば、抽出条件も文字列で指定しないと
抽出は失敗します。

【71418】Re:日付の検索
発言  kanabun  - 12/3/1(木) 12:17 -

引用なし
パスワード
   ▼AoYasu さん:

> 検索表
>   納入日  場所  納入先  受注日  金額
>   3月10日  神田  神田商店  2/9  \15000
>   3月20日  神田  神田商店  2/15  \25000

「納入日」は何行目の 何列目のセルですか?

【71419】Re:日付の検索
質問  AoYasu  - 12/3/1(木) 12:42 -

引用なし
パスワード
   ▼kanabun さん:

数式バーには2007/2/9となっていました
確認は2/9があるセルにカーソルをあて
セルの書式設定で見ましたら
表示形式が ユーザー定義 m/d となっていました

マクロで表の中のセル形式がどうなっているかを
調べ それに合わせた抽出条件表のセルもその表示形式
にすると云うことでしょうか


>> 検索表
>>   納入日  場所  納入先  受注日  金額
>>   3月10日  神田  神田商店  2/9  \15000
>>   3月20日  神田  神田商店  2/15  \25000
>>
>>   調べましたら 受注日 2/9 は2007/2/9 で
>これをどうやって確認したのですか?
>受注日の列で たとえば「2/9」と表示されているセルをクリックすると、
>数式バーにはどのように表示されますか?
>
>>   抽出条件の2列目を文字設定("G標準")して
>>   2/9 を入れますと2012/2/9 の日付シリアル値に
>>   なってしまいます
>セルの表示形式がどのようになっていようと、「フィルタオプション」で
>の抽出には影響ありません。セルの値がどうなっているかが重要です。
>表のほうが日付型であれば、抽出条件も日付型に、
>表のほうが(仮に)文字列なのであれば、抽出条件も文字列で指定しないと
>抽出は失敗します。

【71420】Re:日付の検索
質問  AoYasu  - 12/3/1(木) 12:48 -

引用なし
パスワード
   ▼kanabun さん:
  「納入日」("B3")で実際には項目は("B3:M3")まであります
  「納入日」の値は("B4")からになります

>▼AoYasu さん:
>
>> 検索表
>>   納入日  場所  納入先  受注日  金額
>>   3月10日  神田  神田商店  2/9  \15000
>>   3月20日  神田  神田商店  2/15  \25000
>
>「納入日」は何行目の 何列目のセルですか?

【71421】Re:日付の検索
発言  kanabun  - 12/3/1(木) 13:00 -

引用なし
パスワード
   ▼AoYasu さん:

>数式バーには2007/2/9となっていました
それなら、データのほうは問題ないようですね
抽出条件範囲 CriteriaRange の 1行目を 「受注日」
2行目を 抽出したい日付「2007/2/9」とすれば抽出できると
思います。
問題は TextBoxに "2/9" と入力しただけで、 それを 抽出条件範囲に
コピーしただけでは 今年の2/9 (2012/2/9 ) になっちゃうので、
年をどう補って 2007/2/9 とするか、ですね?
抽出条件範囲 が Sht2の [B1:B2] だとすると、

  Sht2.[B1].Value = Ran.Cells(1, 4).Value
  Sht2.[B2].Value = CDate(Year(Ran.Cells(2,4).Value) & "/" & _
                  TextBox受注日.Text)

のようにして、うまく年号を付加することができればいいけど?

【71422】Re:日付の検索
発言  kanabun  - 12/3/1(木) 13:06 -

引用なし
パスワード
   ▼AoYasu さん:
>▼kanabun さん:
>  「納入日」("B3")で実際には項目は("B3:M3")まであります
>  「納入日」の値は("B4")からになります
そしたら、表範囲(フィルタ範囲)は
>   Set Ran = sht3.Range("B" & Mgyou).CurrentRegion
>  Set Ran = Intersect(Ran, Ran.Offset(, 1))
のかわりに、
  With Sht3
    Set Ran = .Range(.Cells(.Rows.Count,"B").End(xlUp), "M3")
  End With
でもいいですね?

【71423】Re:日付の検索
質問  AoYasu  - 12/3/1(木) 13:07 -

引用なし
パスワード
   ▼kanabun さん:
いろいろとお世話になり、ありがとうございました
 ”セルの値がどうなっているかが重要”
 思い込みで 表示形式ばかりに考えがいっていました
 入力するときに2007/2/9でトライしました結果
 うまくいきました

 最後の質問ですいませんが
 入力するときに 2/9が ”2007/2/9”なのか”2009/2/9”
 なのか分かりません
 どのようにしたらよろしいのでしょうか

【71425】Re:日付の検索
発言  kanabun  - 12/3/1(木) 14:20 -

引用なし
パスワード
   ▼AoYasu さん:

> 入力するときに2007/2/9でトライしました結果
> うまくいきました
>
> 最後の質問ですいませんが
> 入力するときに 2/9が ”2007/2/9”なのか”2009/2/9”
> なのか分かりません
> どのようにしたらよろしいのでしょうか
TextBoxには 「2/9」だけタイプし、抽出しようとしている受注日データの
最初の日付を読んで、その年号+TextBoxの月日 で 年月日を作ろうとしている
のが、【71421】に書いた案です。
うまく行くといいのですが?

【71426】Re:日付の検索
質問  AoYasu  - 12/3/1(木) 15:49 -

引用なし
パスワード
   ▼kanabun さん:
 ご解答ありがとうございました
 ここで一つ知識不足ですいません
  マクロの書き方で
 1:sht2.[B1].Value ---[B1]の意味
 2;Ran.Cells(1, 4).Value -----ここでは何を取得するのでしょうか 
 よろしくお願いいたします 


>>  抽出条件範囲 が Sht2の [B1:B2] だとすると、
>>    sht2.[B1].Value = Ran.Cells(1, 4).Value
>>    sht2.[B2].Value = CDate(Year(Ran.Cells(2, 4).Value) & "/" & _
                  TextBox受注日.Text)

>▼AoYasu さん:
>
>> 入力するときに2007/2/9でトライしました結果
>> うまくいきました
>>
>> 最後の質問ですいませんが
>> 入力するときに 2/9が ”2007/2/9”なのか”2009/2/9”
>> なのか分かりません
>> どのようにしたらよろしいのでしょうか
>TextBoxには 「2/9」だけタイプし、抽出しようとしている受注日データの
>最初の日付を読んで、その年号+TextBoxの月日 で 年月日を作ろうとしている
>のが、【71421】に書いた案です。
>うまく行くといいのですが?

【71429】Re:日付の検索
発言  kanabun  - 12/3/1(木) 19:58 -

引用なし
パスワード
   ▼AoYasu さん:
>▼kanabun さん:
> ここで一つ知識不足ですいません
>  マクロの書き方で
> 1:sht2.[B1].Value ---[B1]の意味
> 2;Ran.Cells(1, 4).Value -----ここでは何を取得するのでしょうか 

全体のコードが提示されてないので、こちらでそれっぽいものを適当に
書いてみると以下のようになります。
これは UserForm1の TextBox受注日 に 抽出したい日付けを、たとえば「2/9」
のようにタイプしたあと、よこの CommandButton1をクリックすると、
Sht3の表から 指定の日付の行を Sht1 へ抽出コピーするものです。


Private Sub CommandButton1_Click()
  Dim Sht1 As Worksheet
  Dim Sht2 As Worksheet
  Dim Sht3 As Worksheet
  Dim fRange As Range ' Filter Range(抽出元の表範囲)
  Dim cRange As Range 'CriteriaRange(検索条件範囲)
  Dim CopyTo As Range 'CopyTo Range (抽出先)
  
  Set Sht1 = Worksheets(1)
  Set Sht2 = Worksheets(2)
  Set Sht3 = Worksheets(3)
  '--- フィルタ範囲 ------ 左下セルと右上セルとで指定
  With Sht3
    Set fRange = .Range(.Cells(.Rows.Count, "B").End(xlUp), "M3")
  End With
  '--- 抽出条件範囲 ------
  Set cRange = Sht2.[B1:B2]
  cRange.Item(1).Value = fRange.Item(1, 4).Value
  cRange.Item(2).Value = CDate(Year(fRange.Item(2, 4).Value) & "/" _
             & TextBox受注日.Text)
  '--- 抽出先先頭セル -----
  Set CopyTo = Sht1.[B1]
  
  fRange.AdvancedFilter xlFilterCopy, CriteriaRange:=cRange, _
             CopyToRange:=CopyTo
  Sht1.Activate
End Sub

説明1
>  Set cRange = Sht2.[B1:B2]
の .[B1:B2] は .Range("B1:B2") の簡略した書き方です。

説明2
>  Set cRange = Sht2.[B1:B2]
>  cRange.Item(1).Value = fRange.Item(1, 4).Value
この.Item というのは コレクション内の個々の要素を指定するときに
使われるプロパティです。ここでは Sht2.[B1:B2] の2つのセルを
cRange というRangeコレクションにしていますから、
>  cRange.Item(1)
というのは Sht2.[B1:B2] の最初のセル つまり Sht2.[B1] のことです。
cRange.Item(2) は cRangeコレクション内の2番目のセル すなわち
Sht2.[B2] のことです。
同様にして
> fRange.Item(1, 4)
とは、fRange(フィルタ範囲 のこと) 内の 1行目、4列目のセルのこと
を意味します。fRange.Cells(1,4) とも書きます。
注意しなければいけないのは fRangeの1列目は シートの2列目(B列)
のことなので、fRangeの 4列目は シートの E列 ということになります。
同様に fRangeの1行目は シート全体でいえば 3行目のことです。
まとめると、
>  cRange.Item(1).Value = fRange.Item(1, 4).Value
は、fRangeの4列目の列見出し「受注日」を CriteriaRangeの
1行目に転記する、という処理をしています。

説明3
>  cRange.Item(2).Value = CDate(Year(fRange.Item(2, 4).Value) & "/" _
             & TextBox受注日.Text)
ここは、
いま、TextBox受注日.Text が 「2/9 」 だとして、何年の 2月9日なのか
分からないので、抽出表の 「受注日」列の 2行目の日付データから 年号部分を
取得しようとしているところです。
     B    C    D    E    F  
>3   納入日  場所  納入先  受注日  金額
>4   3月10日  神田  神田商店  2/9  \15000
>5   3月20日  神田  神田商店  2/15  \25000
E列の4行目 (fRange.Item(2,4) のセル) には 「2/9」という日付データが
ありますが、数式バーを見ると分るように このセルの値は「2010/2/9 」です。
Year関数で 年号を取り出すと 2010が得られます。
> CDate(Year(fRange.Item(2, 4).Value) & "/" & TextBox受注日.Text)

  CDate(2010 & "/" & "2/9")
つまり
  cRange.Item(2).Value = CDate("2010/2/9")
を実行して 抽出条件範囲の2行目に 2010/2/9 という日付けを書き込んでいる
わけです。

【71430】Re:日付の検索
お礼  AoYasu  - 12/3/1(木) 21:04 -

引用なし
パスワード
   ▼kanabun さん:
すごくご丁寧な回答をいただき恐縮です
これをもとにしっかり勉強して日付の検索
を仕上げてみます
また、何かわからないことが出ましたら
ご教示お願いします
ありがとうございました

1865 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free