Excel VBA質問箱 IV

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

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


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

【75574】advancedfilterでの日付け検索 masu 14/5/21(水) 13:17 質問[未読]
【75576】Re:advancedfilterでの日付け検索 kanabun 14/5/21(水) 14:27 発言[未読]
【75577】Re:advancedfilterでの日付け検索 masu 14/5/21(水) 16:10 質問[未読]
【75578】Re:advancedfilterでの日付け検索 kanabun 14/5/21(水) 16:57 発言[未読]
【75580】Re:advancedfilterでの日付け検索 masu 14/5/21(水) 17:37 お礼[未読]
【75602】Re:advancedfilterでの日付け検索 masu 14/5/23(金) 15:27 質問[未読]
【75605】Re:advancedfilterでの日付け検索 yuto 14/5/23(金) 21:22 回答[未読]
【75607】Re:advancedfilterでの日付け検索 masu 14/5/23(金) 21:49 お礼[未読]
【75606】Re:advancedfilterでの日付け検索 kanabun 14/5/23(金) 21:28 発言[未読]
【75608】Re:advancedfilterでの日付け検索 kanabun 14/5/23(金) 23:22 発言[未読]
【75609】Re:advancedfilterでの日付け検索 masu 14/5/24(土) 8:46 質問[未読]
【75610】Re:advancedfilterでの日付け検索 kanabun 14/5/24(土) 11:14 発言[未読]
【75611】Re:advancedfilterでの日付け検索 masu 14/5/24(土) 12:19 質問[未読]
【75612】Re:advancedfilterでの日付け検索 kanabun 14/5/24(土) 13:23 発言[未読]
【75613】Re:advancedfilterでの日付け検索 kanabun 14/5/24(土) 17:46 発言[未読]
【75614】Re:advancedfilterでの日付け検索 masu 14/5/24(土) 18:11 お礼[未読]

【75574】advancedfilterでの日付け検索
質問  masu  - 14/5/21(水) 13:17 -

引用なし
パスワード
   advancedfilterでの日付け検索を行いましたが
年の場合は上手く検索できるのですが
月;日の検索が上手くいきません

  検索sheetに
 5行目 2012/8/5
 6行目 2012/8/5AM  があるとします

  E1
  E2 =MONTH(Sheet1!D7)=8
  E3 =LEFT(Sheet1!D7,2)="8"

  E1
  E2 =DAY(Sheet1!D7)=5
  E3 =LEFT(Sheet1!D7,2)="5"

で検索しますと 5行目 2012/8/5 の値は検索されますが
6行目 2012/8/5AM  の値は検索されません
月;日も同じ結果です
LEFT関数の処理がおかしいとおもうのですが
処理の仕方が分からず困っています
よろしくお願いします

【75576】Re:advancedfilterでの日付け検索
発言  kanabun  - 14/5/21(水) 14:27 -

引用なし
パスワード
   ▼masu さん:
>advancedfilterでの日付け検索を行いましたが
>年の場合は上手く検索できるのですが
>月;日の検索が上手くいきません
>
>  検索sheetに
> 5行目 2012/8/5
> 6行目 2012/8/5AM  があるとします
>
>  E1
>  E2 =MONTH(Sheet1!D7)=8
>  E3 =LEFT(Sheet1!D7,2)="8"
>
>  E1
>  E2 =DAY(Sheet1!D7)=5
>  E3 =LEFT(Sheet1!D7,2)="5"
>
>で検索しますと 5行目 2012/8/5 の値は検索されますが
>6行目 2012/8/5AM  の値は検索されません

いくつか判らないことがあります。

Q1. まず、
データが 「5行目」「6行目」にあるのに、
>  E2 =MONTH(Sheet1!D7)=8
>  E3 =LEFT(Sheet1!D7,2)="8"
検索条件式がD7 と7行目になっているのはなぜですか?

Q2. つぎに、
> 6行目 2012/8/5AM
この値は「日付」ではなく「文字列」です。
2つ目の検索条件式が
>  E3 =LEFT(Sheet1!D7,2)="8"
となっているのは、文字列の"8"を見つけようとしているからですか?

Q3. Q2.の通りだとすると、
> =LEFT(Sheet1!D7,2)="8"
はおかしい。これは D7セルの文字列の「左から2文字が"8"である」という
式ですから、"8"は2文字でないのでどんなデータとも永久に合いません。
「左から n 番目の1文字が "8"なら」とするには

 =MID(Sheet1!D7,n,1)="8"

とする必要があります。(nには適当な数値を入れる)

【75577】Re:advancedfilterでの日付け検索
質問  masu  - 14/5/21(水) 16:10 -

引用なし
パスワード
   ▼kanabun さん:
質問が上手く書けていないようでしたので
 再度書かせていただきました

  検索sheet1 のD列に
      D
 2行目 2002/10/5
 3行目 2010/11/15
 4行目 2014/1/25
 5行目 2012/8/5
 6行目 2012/8/5AM
 7行目 2015/12/5AM  があるとします
  ・
  ・

これをAdvancedFilterで検索をしています
この中から条件式にあったものを抽出する
例えば
 8月のみを検索するときの条件式は
  検索条件式
  E1             
  E2 =MONTH(Sheet1!D2)=8   
  E3 =MID(Sheet1!D2,n,1)="8"

5日のみを検索するときの条件式は
  検索条件式
  E1   
  E2 =DAY(Sheet1!D2)=5
  E3 =MID(Sheet1!D2,n,1)="5"

この時の n は 1 を入れておけばよろしいのでしょうか
また、月及び日の値が 12 等の2桁の場合は
=MID(Sheet1!D2,n,2)="12" なのでしょうか

よろしくお願いします

【75578】Re:advancedfilterでの日付け検索
発言  kanabun  - 14/5/21(水) 16:57 -

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

> 6行目 2012/8/5AM
> 7行目 2015/12/5AM  があるとします

>例えば
> 8月のみを検索するときの条件式は
>  検索条件式
>  E1             
>  E2 =MONTH(Sheet1!D2)=8   
>  E3 =MID(Sheet1!D2,n,1)="8"

>この時の n は 1 を入れておけばよろしいのでしょうか

たとえば
> 6行目 2012/8/5AM
とあったら、"8" は 文字列"2012/8/5AM"の左から何文字目の1文字ですか
6文字目ですよね?
なので、
  E3 =MID(Sheet1!D2,6,1)="8"
です。


>また、月及び日の値が 12 等の2桁の場合は
> =MID(Sheet1!D2,n,2)="12" なのでしょうか

それも同じことで、
> 7行目 2015/12/5AM
       ↑↑ 
の6文字目から2文字分を抽出して "12"と比較するわけですから、
  E3 =MID(Sheet1!D2,6,2)="12"
です。

【75580】Re:advancedfilterでの日付け検索
お礼  masu  - 14/5/21(水) 17:37 -

引用なし
パスワード
   ▼kanabun さん:
有難うございました
理解出来ました
文字位置 更に文字数を調べて
MID関数を使用
その結果思うような結果がえられました
また、疑問点が出ましたら
よろしくお願いします

【75602】Re:advancedfilterでの日付け検索
質問  masu  - 14/5/23(金) 15:27 -

引用なし
パスワード
   ▼kanabun さん:
再質問です
以下のようなデーターがあるとしまして
  データー
    2015/9/12 Am
    2012/2/10:15:30:00
    2016/8/11 am
    2016/7/10 pm
    02/08/01 PM

以下のマクロを作成しまして
年;月の値は取得できましたが
日の値を取得する方法が分かりません
よろしくお願いします

Sub GetInStr()
  Dim FA_NAME As String
  Dim M As Integer
  Dim F1 As String
  Dim F2 As String
  Dim F3 As String
  Dim Gyou As Integer
  Dim Retu As Integer
  Dim sht As Worksheet
  
   Gyou = 6
   Retu = 5
  
   Set sht = ThisWorkbook.Worksheets("sheet1")
   Do
     FA_NAME = sht.Cells(Gyou, Retu)
  
     If InStr(1, FA_NAME, "/") = 0 Then
       Exit Do
     Else
       '---- 年を取得 ----
       ' 2015/9/12 AM --"/"は先頭から5文字目にあるから
       '前m=5-1 4文字 "2015"を取得

       M = InStr(1, FA_NAME, "/") - 1         '-----M=4
       sht.Cells(Gyou, Retu + 2) = Left(FA_NAME, M)  '-----"2015"
      
       '---- 月を取得 ----
       '2015/9/12 AM--の先頭6文字目から後ろを取得する
       'FA_NAME="9/12 AM"を取得
       '"/"は先頭から2文字目にあるから
       '前M=2-1 1文字 "9"を取得

       FA_NAME = Trim(Mid(FA_NAME, (InStr(FA_NAME, "/") + 1)))
       M = (InStr(FA_NAME, "/") - 1)
       sht.Cells(Gyou, Retu + 3) = Left(FA_NAME, M)
      
       '---- 日を取得----
       ’????????????
       ’????????????
       FA_NAME = Trim(Mid(FA_NAME, (InStr(FA_NAME, " ") + 1)))
       M = (InStr(FA_NAME, " ") + 1)
       F3 = Left(FA_NAME, M)
       sht.Cells(Gyou, Retu + 4) = F3       
       Gyou = Gyou + 1      
     End If
   Loop

【75605】Re:advancedfilterでの日付け検索
回答  yuto  - 14/5/23(金) 21:22 -

引用なし
パスワード
   質問内容とやり方が異なりますが、
私ならこんな感じで処理するかなという一例です。

そういうことではなく、手法にこだわりがあるという場合は
読み捨ててください。

Sub Test()
  Const xColumn As Integer = 5   '列を指定 適宜条件を合わせてください。
  Dim yRow As Integer, v As Variant

  For yRow = 6 To Cells(Rows.Count, xColumn).End(xlUp).Row  ’1行目〜入力済み最終行までを指定。
    With Cells(yRow, xColumn)  ’基準の位置を指定
      v = Split(.Text, "/")      ’文字列を/で区切り、配列に格納
      .Offset(, 2).Value = v(0)  ’年の部分
      .Offset(, 3).Value = v(1)  ’月の部分
      .Offset(, 4).Value = Val(v(2)) ’日の部分 ※Val() で数値として判断可能な最初の要素を取得
    End With
  Next yRow
End Sub

心情はわからなくもないのですが、
質問の際に回答者を名指ししている様にとれる書き込みは
さけた方が望ましいかと。

【75606】Re:advancedfilterでの日付け検索
発言  kanabun  - 14/5/23(金) 21:28 -

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

>  データー
>    2015/9/12 Am
>    2012/2/10:15:30:00
>    2016/8/11 am
>    2016/7/10 pm
>    02/08/01 PM
>

>日の値を取得する方法が分かりません

そういうばあいは / で文字列を 年、月、日以降 に分けましょう

Sub Try1()
  Dim v
  Dim t(1 To 3) ' t(Year,Month,Day)
  Dim c As Range
  
  With ThisWorkbook.Worksheets("sheet1")
    For Each c In .Range("E6", .Cells(.Rows.Count, "E").End(xlUp))
      v = Split(c.Value, "/")
      If UBound(v) = 2 Then
        t(1) = Val(v(0))  'Year
        t(2) = Val(v(1))  'Month
        t(3) = Val(v(2))  'Day
        If t(1) < 2000 Then t(1) = t(1) + 2000
        c.Offset(, 2).Resize(, 3).Value = t
      End If
    Next
  End With
End Sub

'----------------------
2015/9/12 Am        2015    9    12
2012/2/10:15:30:00        2012    2    10
2016/8/11 am        2016    8    11
2016/7/10 pm        2016    7    10
02/08/01 PM        2002    8    1

【75607】Re:advancedfilterでの日付け検索
お礼  masu  - 14/5/23(金) 21:49 -

引用なし
パスワード
   ▼yuto さん:
 丁寧な回答有難うございます
 早速参考にさせていただきます
ご忠告有難うございます
返信の部分を消し忘れていたようです
今後気を付けます

【75608】Re:advancedfilterでの日付け検索
発言  kanabun  - 14/5/23(金) 23:22 -

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

間が悪く、気付いてないといけないので、レスしときます。

↓を参照あれ

【75606】Re:advancedfilterでの日付け検索

【75609】Re:advancedfilterでの日付け検索
質問  masu  - 14/5/24(土) 8:46 -

引用なし
パスワード
   有難うございました
確認しました
一点疑問がでましてこれからトライしてみようと
思っています
それはadvancedfilteで検索条件式にどのように
書いたらよいかです
年;月---はMID関数を書きましたが
日は取得できましたが 検索条件式をどうするかです
よろしくお願いします

【75610】Re:advancedfilterでの日付け検索
発言  kanabun  - 14/5/24(土) 11:14 -

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

>一点疑問がでましてこれからトライしてみようと
>思っています
>それはadvancedfilteで検索条件式にどのように
>書いたらよいかです
>年;月---はMID関数を書きましたが
>日は取得できましたが 検索条件式をどうするかです

AdvancedFilterで 何を抽出するのですか?
前の例は
「年が2012年の行」とか
「月が8月の行」とか
「日が5日の行」とか
でしたよね?
こんどは何を抽出したいのですか?

【75611】Re:advancedfilterでの日付け検索
質問  masu  - 14/5/24(土) 12:19 -

引用なし
パスワード
    質問がまわりくどく すいません、

 Sheet1 の D2 に 2012/8/5 AM があるとします
 2012/8/5 AM が文字列ですので
 下記の条件式でM及びNを求めようとしています
 よろしくお願いします

 '---- 日を取得----
  5日のみを検索するときの条件式は
  検索条件式
  E1   
  E2 =DAY(Sheet1!D2)=5
  E3 =MID(Sheet1!D2,M,N)="5"

【75612】Re:advancedfilterでの日付け検索
発言  kanabun  - 14/5/24(土) 13:23 -

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

> Sheet1 の D2 に 2012/8/5 AM があるとします
> 2012/8/5 AM が文字列ですので
> 下記の条件式でM及びNを求めようとしています

>  E3 =MID(Sheet1!D2,M,N)="5"

それは難しい、というか、簡単にはいきません。
たとえば、以下のようなデータがあった場合を考えてみれば判ります。

    2015/9/5 Am
    2012/2/05:15:30:00
    2016/8/05 am
    2016/7/5 pm
    02/08/05 PM

これら文字列はみな 日にちが5日のようですけど、MIDでは統一して取り
出すことができません。
AdvancedFilterの条件式に Mid以外で条件を書ければいいのですけど、
少なくともぼくはそういう数式を書いたことがないので、式は分りません。

先にやったように、フィルターではなく、一行一行「2つめの"/"の後を
Val関数で数値化」するのが分りやすい方法だと思います。

そもそも、月もちがうデータから ある特定の日にちの行だけ抽出して
何に使うのでしょうか?

【75613】Re:advancedfilterでの日付け検索
発言  kanabun  - 14/5/24(土) 17:46 -

引用なし
パスワード
   AdvancedFilterで 日にちを抽出するなら、
やはり元のデータを文字列から日付け型に修正しておくのが簡単そうです。

D列に こんなデータがあるとして、

 Date
  2012/1/1
 2012/1/1 12:00 AM
  2012/3/5
  2012/8/5
 2012/8/5 0:00
 2012/8/5 12:00 AM
2012/8/5AM
12/8/5 am
2015/9/12 Am
2012/2/10:15:30:00
2016/8/11 am
2016/7/10 pm
02/08/01 PM
2015/9/5 Am
2012/2/05:15:30:00
2016/8/05 am
2016/7/5 pm
02/08/05 PM

以下のマクロを実行します(データは書き換えられるので、複製データで
試してください)
'-----------------------------------------------------------ここから
Sub CDate_Range() 'D列(2行目以降)のデータを日付型に修正
  Dim r As Range
  Dim v
  Dim i&
  Const Msg = "D列(2行目以降)のデータを日付型に修正します。"
  If MsgBox(Msg, vbOKCancel) = vbCancel Then Exit Sub
  
  Set r = Range("D2", Cells(Rows.Count, "D").End(xlUp))
  v = r.Value
  For i = 1 To UBound(v)
    If Not IsDate(v(i, 1)) Then
      v(i, 1) = CDate2(v(i, 1))
    End If
  Next
  r.Value = v
End Sub

Private Function CDate2(s)
  Dim v
  Dim y, m
  Dim ok As Boolean
  
  v = Split(s, "/")
  If UBound(v) = 2 Then
    y = Val(v(0))
    m = Val(v(1))
    Select Case y
     Case 1900 To 2200
       ok = True
     Case Else
       If IsNumeric(y) Then
         If y > 0 And y < 200 Then
           y = y + 2000
           ok = True
         End If
       End If
    End Select
    If ok Then
      Select Case m
       Case 1 To 12
       Case Else
         ok = False
      End Select
    End If
    If ok Then
      CDate2 = DateSerial(y, m, Val(v(2)))
    Else
      CDate2 = s
    End If
  Else
    CDate2 = s
  End If
End Function
'-----------------------------------------------------------ここまで
実行すると上のデータは↓こうなります。
Date
 2012/1/1
 2012/1/1 12:00 AM
 2012/3/5
 2012/8/5
 2012/8/5 0:00
 2012/8/5 12:00 AM
 2012/8/5
 2012/8/5
 2015/9/12
 2012/2/10
 2016/8/11
 2016/7/10
 2002/8/1
 2015/9/5
 2012/2/5
 2016/8/5
 2016/7/5
 2002/8/5

こうしておけば
[E2] =Day(D2)=5
のような条件だけで 日にちを AdvancedFilterできます。

【75614】Re:advancedfilterでの日付け検索
お礼  masu  - 14/5/24(土) 18:11 -

引用なし
パスワード
   ▼kanabun さん:
丁寧な回答有難うございました

 やりたかったことは
 例えば D列のデーターに
  2012/8/5
  2012/8/5 AM
 このようになっていたとき
 year;month;date 関数では
  2012/8/5  が検索され
  2012/8/5 AMが当然ですが検索されないため
  両方を検索したかったのです
早速試してみます
有難うございました
また、わからないことがでましたら
よろしくお願いします

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