Excel VBA質問箱 IV

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

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


8786 / 13646 ツリー ←次へ | 前へ→

【31118】データ抽出 05/11/11(金) 20:37 質問[未読]
【31120】Re:データ抽出 Kein 05/11/11(金) 21:13 回答[未読]
【31143】Re:データ抽出 05/11/12(土) 12:46 お礼[未読]
【31144】Re:データ抽出 Kein 05/11/12(土) 13:37 回答[未読]
【31183】Re:データ抽出 05/11/14(月) 12:31 お礼[未読]
【31187】Re:データ抽出 Kein 05/11/14(月) 12:44 発言[未読]
【31194】Re:データ抽出 05/11/14(月) 14:07 お礼[未読]
【31197】Re:データ抽出 Kein 05/11/14(月) 14:40 発言[未読]
【31201】Re:データ抽出 05/11/14(月) 14:53 発言[未読]
【31204】Re:データ抽出 Kein 05/11/14(月) 15:39 回答[未読]
【31209】Re:データ抽出 05/11/14(月) 16:34 お礼[未読]

【31118】データ抽出
質問    - 05/11/11(金) 20:37 -

引用なし
パスワード
   質問なのですが、CSV形式のログファイル
  A    B      C      D       E
1 日付  ユーザID  グループID  ユーザ名  グループ名
2 10日  1000     10000     n       m
3 11日  1001     10000     n1       m

このCSVファイル(150件ほど)を一度別の場所に出力後、B列とC列のみを左詰めで
表示させたいのですが、ファイルを出力する方法はわかるのですが列の削除の方法がわかりません。よろしければ、ご教授お願いします。
 以下の文までは自分で書けたのですが。

Sub ログ抽出()
 Dim Line1 As String
 Dim FName1 As Variant
 FName2 = "C:\ログ.csv"
FName1 = Application.GetOpenFilename(FileFilter:="CSVファイル (*.csv), *.csv")
   i = 0
Open FName1 For Input As #1
Open FName2 For Output As #2
 Do Until EOF(1)
  Line Input #1, Line1
  Print #2, Line1
   i = i + 1
     Loop
    Close #1
    Close #2
 End Sub

【31120】Re:データ抽出
回答  Kein  - 05/11/11(金) 21:13 -

引用なし
パスワード
   150件もあって、1つづつ書き換えしていくつもりですか ? 普通は一ヶ所のフォルダー
にまとめて保存しておき、Dir関数でループするなどして、いっぺんにやってしまうのが
良いと思うけど、まぁそのコードを改造するとして

Sub ログ抽出()
  Dim Ary As Variant
  Dim Buf As String, FName1 As String
  Const FName2 As String = "C:\ログ.csv"

  FName1 = Application _
  .GetOpenFilename("CSVファイル (*.csv), *.csv")
  If FName1 = "False" Then Exit Sub
  On Error Resume Next
  Open FName1 For Input As #1
  Open FName2 For Output As #2
  Do Until EOF(1)
   Line Input #1, Buf
   Ary = Split(Buf, ",")
   Print #2, Ary(0) & Ary(3) & Ary(4)
  Loop 
  Close #1: Close #2
  MsgBox "終了しました", 64
End Sub

確実に E列までデータがないと、失敗しますのでご注意下さい。

【31143】Re:データ抽出
お礼    - 05/11/12(土) 12:46 -

引用なし
パスワード
   ▼Kein さん:
 お返事ありがとうございます。実行したらうまくいきました。
 重ねて質問して恐縮なのですが、
  A    B      C      
1 日付  ユーザID  グループID  
2 10日  1000     10000    
3 10日  1001     10000    
4 10日  1000     20000    

 例えば
 10日の日にグループID 10000のデータが何件あるかをメッセージボックスに
 表示させるにはどのような関数を使ってデータを参照すればよいのでしょうか
 ?

【31144】Re:データ抽出
回答  Kein  - 05/11/12(土) 13:37 -

引用なし
パスワード
   こんな感じで、どうでしょーか ?

Sub 抽出2()
  Dim FName As String
  Dim Cnt As Long
 
  With Application
   FName = .GetOpenFilename("CSVファイル (*.csv), *.csv")
   If FName = "False" Then Exit Sub
   .ScreenUpdating = False
  End With
  Workbooks.Open FName
  With Range("A1")
   .AutoFilter 1, "10日"
   .AutoFilter 3, "10000"
  End With
  Cnt = ActiveSheet.AutoFilter.Range.Columns(1) _
  .SpecialCells(12).Count
  If Cnt > 1 Then
   Cnt = Cnt - 1
   MsgBox "日付10日でID1000は " & Cnt & " 個あります"
  Else
   MsgBox "抽出件数なし"
  End If
  ActiveSheet.AutoFilterMode = False
  ActiveWorkbook.Close False
  Application.ScreenUpdating = True
End Sub

【31183】Re:データ抽出
お礼    - 05/11/14(月) 12:31 -

引用なし
パスワード
   ▼Kein さん:
 お返事ありがとうございます。動作確認いたしました。
 話が前後して申し訳ないのですが、最初の返信でお返事いただいた
 マクロの結果を見ると、A列に2列分のデータが入力されているのですが
 2列に分けるにはどうすればいいのでしょうか?
 
 

【31187】Re:データ抽出
発言  Kein  - 05/11/14(月) 12:44 -

引用なし
パスワード
   あー・・カンマで区切ってなかったですね。すいません。

Print #2, Ary(0) & "," & Ary(3) & "," & Ary(4)

というように修正して下さい。

【31194】Re:データ抽出
お礼    - 05/11/14(月) 14:07 -

引用なし
パスワード
   ▼Kein さん:
 カンマの件ありがとうございます。
 メッセージボックスを表示させるマクロをKeinさんの返信を参考に
 書いたのですが
  10日-ID 10000  11日-ID 10000
      20000      20000
      30000      30000
      40000      40000
      50000      50000
  というように10パターンほど書いただけで80行ほどになってしまいました。
  もう少しマクロをスマートにまとめる方法があれば教えていただけないで
  しょうか。

【31197】Re:データ抽出
発言  Kein  - 05/11/14(月) 14:40 -

引用なし
パスワード
   逆にお尋ねしますが、そのカウントをとる処理というのは
「多数入力されている日付ごとに、IDが10000のものだけカウントしたい」
ということなのでしょーか ?

【31201】Re:データ抽出
発言    - 05/11/14(月) 14:53 -

引用なし
パスワード
   ▼Kein さん:
 はい、そうです。
 日付ごとにID10000が何回、ID20000が何回というようにシステムへの
 アクセス回数をメッセージとして表示したいのです。

【31204】Re:データ抽出
回答  Kein  - 05/11/14(月) 15:39 -

引用なし
パスワード
   そーいうことですと、MsgBoxなどに表示するのは無理がありそうですね。
ならば集計機能を使って、セルに表示するようにしたら良いと思います。
こんな感じのコードでどうでしょーか ?

Sub Test_ID集計()
  Application.ScreenUpdating = False
  With Range("A1").CurrentRegion
   .Sort Key1:=Range("A1"), Order1:=xlAscending, _
   Key2:=Range("C1"), Order2:=xlAscending, _
   Header:=xlYes, Orientation:=xlSortColumns
   .Subtotal 1, xlCount, Array(3)
   .Subtotal 3, xlCount, Array(3)
  End With
  Cells.ClearOutline
  Application.ScreenUpdating = True
End Sub

実行後は、アウトラインを非表示にしているので分かりにくいですが、
集計の機能がかかったままになっています。なのでカウントをチェックした後は
「データ」「集計」「すべて削除」で集計機能を解除してから終わらせて下さい。

【31209】Re:データ抽出
お礼    - 05/11/14(月) 16:34 -

引用なし
パスワード
   ▼Kein さん:
 動作確認し、正常に集計されていました。
  これまでご丁寧に返事をいただきまして本当にありがとうございます。

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