Excel VBA質問箱 IV

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

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


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

【34831】データ並び替え たま 06/2/14(火) 12:13 質問[未読]
【34832】Re:データ並び替え やっちん 06/2/14(火) 12:42 発言[未読]
【34835】Re:データ並び替え inoue 06/2/14(火) 13:25 発言[未読]
【34836】Re:データ並び替え だるま 06/2/14(火) 13:40 回答[未読]
【34839】Re:データ並び替え たま 06/2/14(火) 14:40 発言[未読]
【34840】Re:データ並び替え inoue 06/2/14(火) 15:23 発言[未読]
【34841】Re:データ並び替え たま 06/2/14(火) 16:20 発言[未読]
【34842】Re:データ並び替え だるま 06/2/14(火) 16:23 回答[未読]
【34848】Re:データ並び替え たま 06/2/14(火) 19:04 質問[未読]
【34856】Re:データ並び替え やっちん 06/2/14(火) 20:22 発言[未読]
【34978】Re:データ並び替え たま 06/2/17(金) 14:25 お礼[未読]

【34831】データ並び替え
質問  たま  - 06/2/14(火) 12:13 -

引用なし
パスワード
   ファイルの読み込みから文字比較についての質問です。

CSVファイルから1行ずつ読み込みこみ、各行の1個目のカンマまでの数値が番号なっているのですが、
1行目と2行目の番号を比較して番号が同じなら2行目を1行目の後ろにつなげて1行で別のアウトファイルに出力。
1行目と2行目の番号が違ったら。1行目と2行目は別の行に出力するといったことです。
これが3行、4行と続きます。
行数が結構あるので1行ずつ読み込まないとダメなようです。


(例)
001,A,ba
001,B,aa
002,fd,gg
003,ee,re
003,t,y
004,t,t

001,A,ba,B,aa
002,fd,gg
003,ee,re,t,y
004,t,t

わかりにくいかもしれませんがよろしくお願いします。

【34832】Re:データ並び替え
発言  やっちん  - 06/2/14(火) 12:42 -

引用なし
パスワード
   ▼たま さん:
こんにちは。
番号順にデータが並んでいるのであれば
そんなに難しくはないと思いますよ。
1行づつ読み込むのは定石ですね。

【34835】Re:データ並び替え
発言  inoue E-MAILWEB  - 06/2/14(火) 13:25 -

引用なし
パスワード
   >ファイルの読み込みから文字比較についての質問です。
似たようなのがありました。参考にして下さい。

[データの並び替え]
http://hpcgi1.nifty.com/kenzo30/b_cbbs/cbbs.cgi?mode=al2&namber=29323&rev=&no=0

【34836】Re:データ並び替え
回答  だるま WEB  - 06/2/14(火) 13:40 -

引用なし
パスワード
   こんな感じでいかがでしょうか。^d^

Sub test()
  Dim Dic As Object
  Dim Ky As String
  Dim InPath As String
  Dim OutPath As String
  Dim N As Integer
  Dim D As String
  Dim i As Integer
  
  Set Dic = CreateObject("Scripting.Dictionary")
  InPath = ThisWorkbook.Path & "\In.csv"
  OutPath = ThisWorkbook.Path & "\Out.csv"
  
  N = FreeFile
  Open InPath For Input As #N
  Do Until EOF(N)
    Line Input #N, D
    i = InStr(D, ",")
    Ky = Left$(D, i - 1)
    If Dic.Exists(Ky) Then
      Dic.Item(Ky) = Dic.Item(Ky) & Mid$(D, i)
    Else
      Dic.Item(Ky) = D
    End If
  Loop
  Close #N
  
  D = join(Dic.Items, vbCrLf)
  
  N = FreeFile
  Open OutPath For Output As #N
  Print #N, D
  Close #N
  
  Set Dic = Nothing
End Sub

【34839】Re:データ並び替え
発言  たま  - 06/2/14(火) 14:40 -

引用なし
パスワード
   みなさんありがとうございます。

だるまさんありがとうございます。
コードを参考にしようとしたのですが、オブジェクトの考え方がわからないので・・・後に変更する場合自分じゃ変更できなるなるので。
どこかにオブジェクトについて勉強できるサイトはないですか?

inoueさんありがとうございます。
読み込んだデータをsplit関数で配列として読み込みたいのですがどう変更すればいいですか?あと、参考させていただいたコードでは頭に来る番号が重複するようなのですが、消去したいです。

【34840】Re:データ並び替え
発言  inoue E-MAILWEB  - 06/2/14(火) 15:23 -

引用なし
パスワード
   >読み込んだデータをsplit関数で配列として読み込みたいのですが
>どう変更すればいいですか?
>あと、参考させていただいたコードでは頭に来る番号が
>重複するようなのですが、消去したいです。
後は応用していただければ良いのですが。
ご自分では何もしないのですか?

質問の件だと配列にする必要はないのではないですか?
重複判定後に既存レコードに右に追加する時に、
左の3文字を外すだけでしょうから。

【34841】Re:データ並び替え
発言  たま  - 06/2/14(火) 16:20 -

引用なし
パスワード
   いえいえ何もやっていないのではないです。
自分なりに参考にして改造しています。
しかし分からなかったので質問しました。

配列として考えたほうが例えば2要素目と5要素目を入れ替えて出力するといったことができるかなと思いまして。
ただデータを繋げるだけじゃなくていろいろ操作する必要があるので配列にしようと思いました。

【34842】Re:データ並び替え
回答  だるま WEB  - 06/2/14(火) 16:23 -

引用なし
パスワード
   ▼たま さん:
>みなさんありがとうございます。
>
>だるまさんありがとうございます。
>コードを参考にしようとしたのですが、オブジェクトの考え方がわからないので・・・後に変更する場合自分じゃ変更できなるなるので。
>どこかにオブジェクトについて勉強できるサイトはないですか?

Dictionaryを含むスクリプトのヘルプは下記からダウンロードできます。

[Windows Script]
http://www.microsoft.com/japan/msdn/scripting/default.asp

勉強できるサイトなら、inoueさんのホームページがお勧めです。^d^

【34848】Re:データ並び替え
質問  たま  - 06/2/14(火) 19:04 -

引用なし
パスワード
   頂いた回答を参考に自分なりに作ってみました(未完成)。
Private Sub cmd1_Click()
  
  Dim strIN As String    '入力ファイルパス変数
  Dim strOUT As String   '出力ファイルパス変数
  Dim D As String      '読み込んだファイルの1行のデータ
  Dim Outdata As String   'ファイルに書き込み用データ
  Dim Nin As String     'ファイル番号(インプット用)
  Dim Nout As String    'ファイル番号(アウトプット用)
  Dim Data() As String   'カンマ区切りのデータ
  Dim Datapre() As String  'Dataのひとつ前のデータ

  
  'ファイルの入出力のパスを指定
  strIN = Application.GetOpenFilename("(*.*),*.*", , "入力ファイル指定")
  strOUT = Application.GetSaveAsFilename("", "(*.*),*.*", , "出力ファイル指定")
  
  '未使用のファイル番号を取得
  Nin = FreeFile
  Open strIN For Input As #Nin
  Nout = FreeFile
  Open strOUT For Output As #Nout
  
  '行の最後まで繰り返す
  While Not EOF(Nin)
    'ファイルを1行ずつ読み込む
    Line Input #Nin, D
    
    '「,」区切りでデータを区切る
    Data() = Split(D, ",")
    
    '配列の設定(初期化)
    ReDim Datapre(UBound(Data))
    
    '番号が2桁の場合頭に0を加えて3桁にする。
    If Len(Data(0)) = 2 Then
      Data(0) = "0" & Data(0)
    End If
    
    ???????
    
    '番号が同じならアウトデータの最後にカンマを入れ結合
    If Data(0) = Datapre(0) Then
      Outdata = Outdata & "," & D
    End If
    
    'アウトファイルに書き込む
    If Data(0) <> Datapre(0) Then
      Print #Nout, Outdata
      'アウトファイルに書き込んだデータを空にする。
      Outdata = ""
    End If
    
    '番号の書き換え
    Datapre(0) = Data(0)
     
  Wend

  Close #Nin
  Close #Nout
  
End Sub


あとちょっとの感じがするんですが、これ以降に苦戦しています。
アドバイスください。


(例)
001,A,ba
001,B,aa
002,fd,gg
003,ee,re
003,t,y
004,t,t

001,A,ba,B,aa
002,fd,gg
003,ee,re,t,y
004,t,t

【34856】Re:データ並び替え
発言  やっちん  - 06/2/14(火) 20:22 -

引用なし
パスワード
   ▼たま さん:
こんばんは。
ちょっと修正してみました。

Sub cmd1_Click()
 
  Dim strIN As String    '入力ファイルパス変数
  Dim strOUT As String   '出力ファイルパス変数
  Dim D As String      '読み込んだファイルの1行のデータ
  Dim Outdata As String   'ファイルに書き込み用データ
  Dim Nin As String     'ファイル番号(インプット用)
  Dim Nout As String    'ファイル番号(アウトプット用)
  Dim Data() As String   'カンマ区切りのデータ

 
  'ファイルの入出力のパスを指定
  strIN = Application.GetOpenFilename("(*.*),*.*", , "入力ファイル指定")
  strOUT = Application.GetSaveAsFilename("", "(*.*),*.*", , "出力ファイル指定")
 
  '未使用のファイル番号を取得
  Nin = FreeFile
  Open strIN For Input As #Nin
  Nout = FreeFile
  Open strOUT For Output As #Nout
  
  While Not EOF(Nin)
    'ファイルを1行ずつ読み込む
    Line Input #Nin, D
  
    '「,」区切りでデータを区切る
    Data() = Split(D, ",")
  
    '番号が2桁の場合頭に0を加えて3桁にする。
    If Len(Data(0)) = 2 Then
      D = "0" & D
    End If
  
    '番号が同じならアウトデータの最後にカンマを入れ結合
    If Left(D, 3) = Left(Outdata, 3) Then
      Outdata = Outdata & Mid(D, 4)
    Else
      If Outdata <> "" Then
      'アウトファイルに書き込む
        Print #Nout, Outdata
      End If
      Outdata = D
    End If
  
  Wend
  If Outdata <> "" Then
    Print #Nout, Outdata
  End If

  Close #Nin
  Close #Nout
 
End Sub

【34978】Re:データ並び替え
お礼  たま  - 06/2/17(金) 14:25 -

引用なし
パスワード
   やっちんさんありがとうございました。
うまくいきました。
感謝しています。

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