Excel VBA質問箱 IV

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

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


7362 / 13644 ツリー ←次へ | 前へ→

【39440】条件にあったデータの抽出(他ファイルか... UK 06/6/24(土) 0:52 質問[未読]
【39442】Re:条件にあったデータの抽出(他ファイル... Kein 06/6/24(土) 2:12 回答[未読]
【39564】Re:条件にあったデータの抽出(他ファイ... UK 06/6/26(月) 20:03 質問[未読]
【39568】Re:条件にあったデータの抽出(他ファイ... Kein 06/6/26(月) 22:02 発言[未読]
【39572】Re:条件にあったデータの抽出(他ファイ... UK 06/6/26(月) 22:46 質問[未読]
【39573】Re:条件にあったデータの抽出(他ファイ... Kein 06/6/26(月) 23:13 回答[未読]
【39574】Re:条件にあったデータの抽出(他ファイ... UK 06/6/26(月) 23:38 質問[未読]
【39575】Re:条件にあったデータの抽出(他ファイ... Kein 06/6/27(火) 0:01 発言[未読]
【39576】Re:条件にあったデータの抽出(他ファイ... UK 06/6/27(火) 0:04 お礼[未読]
【39577】Re:条件にあったデータの抽出(他ファイ... Kein 06/6/27(火) 0:08 発言[未読]

【39440】条件にあったデータの抽出(他ファイルか...
質問  UK  - 06/6/24(土) 0:52 -

引用なし
パスワード
   テキストファイルにはPCのログONのログオン者ID、時間、日付とログOFFのログオン者ID、時間、日付のデータがあります。
<ファイル名(固定)>LOG.txt
<データの状態>
LOGON 000123 2006/06/23 09:00:00
LOGOFF 000123 2006/06/23 20:50:40
     .
     .
     .


エクセルから、指定の日付のログON時間とログOFF時間のデータを取り出し、指定のセルに書き出したいのですが、まったくやり方がわかりません。
また、日付が重複した場合、下の方にあるデータを抽出したいと考えています。
<2006/6/23を抽出後のイメージ> 
A列     B列        C列     D列   E列
日付    LOGON時間 LOGOFF時間 勤務時間 残業時間・・・
2006/6/23 09:00:00    20:50:40    11:50  3:50 

初心者で、どのような処理が必要なのかもわからない為、まずは処理フローをお聞きし、自分なりに勉強したいと考えています。

【39442】Re:条件にあったデータの抽出(他ファイ...
回答  Kein  - 06/6/24(土) 2:12 -

引用なし
パスワード
   ロジック自体はたいして難しくありませんが、区切り文字を単純にスペース
としてやってみると、LOGONの場合とLOGOFFの場合では全く違った配列が
できてしまったため、以下のようなコードになりました。

Sub Get_MyLog()
  Dim MyDy As String, Buf As String
  Dim Flg As Boolean
  Dim CkAry As Variant, GetAry As Variant
  Dim LgOn As Variant, LgOf As Variant
  Const MyF = "C:\temp\Log.txt" '正確なフルパスに変更すること。
  
  Do
   Flg = False
   MyDy = InputBox("抽出する日付を yyyy/mm/dd 形式で入力して下さい")
   If MyDy = "" Then Exit Sub
   If Len(MyDy) <> 10 Then Flg = True
   If Mid$(MyDy, 5, 1) <> "/" Or Mid$(MyDy, 8, 1) <> "/" Then
     Flg = True
   End If
   CkAry = Split(MyDy, "/")
   If Not IsNumeric(CkAry(0)) Or Not IsNumeric(CkAry(1)) Or _
   Not IsNumeric(CkAry(2)) Then
     Flg = True
   End If
  Loop While Flg = True
  Open MyF For Input Access Read As #1
  Do Until EOF(1)
   Line Input #1, Buf
   GetAry = Split(Buf, Chr(32))
   If GetAry(1) = MyDy Or GetAry(2) = MyDy Then
     If Left$(GetAry(0), 5) = "LOGON" Then
      LgOn = GetAry(UBound(GetAry))
     ElseIf Left$(GetAry(0), 5) = "LOGOF" Then
      LgOf = GetAry(UBound(GetAry))
     End If
   End If
  Loop
  Close #1
  Worksheets("Sheet1").Range("A65536").End(xlUp) _
  .Offset(1).Resize(, 3).Value = Array(MyDy, LgOn, LgOf)
End Sub

【39564】Re:条件にあったデータの抽出(他ファイ...
質問  UK  - 06/6/26(月) 20:03 -

引用なし
パスワード
   ▼Kein さん:
返信が遅くなりすみませんでした。
Keinさんのコードを試した結果、自分の質問が悪かったため意図する結果を得ることが
出来ませんでした。
自分で解決しようと努力していますが行き詰っています。

まず、テキストファイルの内容には、下記のデータがあります。
(ここが最初の質問と違います。そのため、配列に格納されるデータがLOGONとLOGOFFでことなります。)

<内容>
LOGON - 12360789 - 2006/06/01 08:40:58.
LOGOFF - 23460789 - 2006/06/01 22:16:44.
LOGON - 34500601 - 2006/06/02 20:26:20.
LOGOFF - 45600601 - 2006/06/02 20:26:13.

keinさんのコードの何処を修正すれば、良いのかアドバイスを頂ければと思っています。
追加で、Chr(32)とありますが、この意味がよくわかりません。ヘルプをみても
(32)の説明がないので、できれば説明もお願いします。

>  Do Until EOF(1)
>   Line Input #1, Buf
>   GetAry = Split(Buf, Chr(32))
>   If GetAry(1) = MyDy Or GetAry(2) = MyDy Then
>     If Left$(GetAry(0), 5) = "LOGON" Then
>      LgOn = GetAry(UBound(GetAry))
>     ElseIf Left$(GetAry(0), 5) = "LOGOF" Then
>      LgOf = GetAry(UBound(GetAry))
>     End If
>   End If
>  Loop
>  Close #1

【39568】Re:条件にあったデータの抽出(他ファイ...
発言  Kein  - 06/6/26(月) 22:02 -

引用なし
パスワード
   Chr(32) というのは、Chr関数にASCIIコードを渡して半角スペースを表してます。
つまり
>GetAry = Split(Buf, Chr(32))
の部分は、テキストから一行読み込んで半角スペースを区切り文字として
配列を作っているわけです。で、今回は実際のテキストが
>LOGON - 12360789 - 2006/06/01 08:40:58.
と、なっていることが明らかになりましたが、実際問題としてこれだけでは
区切り文字として何を使えばよいのか、確実なことは分かりません。
そこで区切り文字の情報を知るために、以下のマクロを走らせてイミディエイト
ウィンドウに出力された情報をここへUPして下さい。

Sub Get_ASCII()
  Dim Buf As String, AcSt As String
  Dim i As Long  
  Const MyF = "C:\temp\Log.txt" '正確なフルパスに変更すること。
  
  Open MyF For Input Access Read As #1
  Line Input #1, Buf
  Close #1
  For i = 1 To Len(Buf)
   AcSt = AcSt & Asc(Mid$(Buf, i, 1)) & ","
  Next i
  Debug.Print AcSt
End Sub

【39572】Re:条件にあったデータの抽出(他ファイ...
質問  UK  - 06/6/26(月) 22:46 -

引用なし
パスワード
   ▼Kein さん:
返信ありがとうございます。

出力結果は下のとおりです。

76,79,71,79,78,-32448,45,32,49,50,51,54,48,55,56,57,32,45,32,50,48,48,54,47,48,54,47,48,49,32,48,56,58,52,48,58,53,56,46,

これで良いのですか?

【39573】Re:条件にあったデータの抽出(他ファイ...
回答  Kein  - 06/6/26(月) 23:13 -

引用なし
パスワード
   それで結構です。では、06/6/24(土) 2:12 に提示したコードのループの部分を

  Do Until EOF(1)
   Line Input #1, Buf
   Buf = Left$(Buf, Len(Buf) - 1) '←追加
   Buf = Replace(Buf, Chr(45), "") '←追加
   GetAry = Split(Buf, Chr(32))
   If GetAry(1) = MyDy Or GetAry(2) = MyDy Then
     If Left$(GetAry(0), 5) = "LOGON" Then
      LgOn = GetAry(UBound(GetAry))
     ElseIf Left$(GetAry(0), 5) = "LOGOF" Then
      LgOf = GetAry(UBound(GetAry))
     End If
   End If
  Loop

というように2行追加して、実行してみて下さい。

【39574】Re:条件にあったデータの抽出(他ファイ...
質問  UK  - 06/6/26(月) 23:38 -

引用なし
パスワード
   ▼Kein さん:
ありごうございます。
少しだけ、手直ししたら完成しました。
手直し箇所は、
>   If GetAry(1) = MyDy Or GetAry(2) = MyDy Then
をIf GetAry(3) = MyDy Or GetAry(4) = MyDy Thenに変更しました。

今後のために教えて欲しいのですが、先ほどUPした数値の意味や活用方法についてと追加箇所の説明をお願いいたします。
>   Buf = Left$(Buf, Len(Buf) - 1) '←追加
>   Buf = Replace(Buf, Chr(45), "") '←追加

ずうずうしいと思いますが、よろしくお願い致します。

【39575】Re:条件にあったデータの抽出(他ファイ...
発言  Kein  - 06/6/27(火) 0:01 -

引用なし
パスワード
   >Buf = Left$(Buf, Len(Buf) - 1) '←追加
これは読み込んだ行の末尾に、時刻を表すデータには不要な文字が
混じっているので、それを取り除くためのコードです。
>Buf = Replace(Buf, Chr(45), "") '←追加
これは特にあってもなくても構わないコードですが、Chr(45)の文字を
取り除いています。最初の質問には無かった "-" です。

【39576】Re:条件にあったデータの抽出(他ファイ...
お礼  UK  - 06/6/27(火) 0:04 -

引用なし
パスワード
   ▼Kein さん:
本当にありがとうございました。
今後の参考にさせて頂きます。

【39577】Re:条件にあったデータの抽出(他ファイ...
発言  Kein  - 06/6/27(火) 0:08 -

引用なし
パスワード
   ついでに、問題のループの部分をもう少し効率よく書き直してみますと

 Do Until EOF(1)
   Line Input #1, Buf
   If InStr(1, Buf, MyDy) > 0 Then
    Buf = Left$(Buf, Len(Buf) - 1)
    GetAry = Split(Buf, Chr(32))
    If Left$(GetAry(0), 5) = "LOGON" Then
      LgOn = GetAry(UBound(GetAry))
    ElseIf Left$(GetAry(0), 5) = "LOGOF" Then
      LgOf = GetAry(UBound(GetAry))
    End If
   End If
  Loop

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