人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

質問です
c:\TEST\のホルダーに複数のcsvファイルがあります
G列にランダムな6桁の整数データがA列にあるデータ行の分だけ記入できるマクロをお願いします
最初の数字が0にならないないようにしたいのですがもし0がくる場合は列全体を文字列に
なるようにお願いします
データは1行目からあります
よろしくお願いします

●質問者: inosisi
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● oil999
●100ポイント

G列に100000?999999からランダムに選んだ整数を入れます。
A列がない行には入れません。

Option Explicit

'拡張子を除く
Function GetFNameFromFStr(sFileName As String) As String
 Dim sFileStr As String
 Dim lFindPoint As Long
 Dim lStrLen As Long
 
  '文字列の右端から"."を検索し、左端からの位置を取得する
 lFindPoint = InStrRev(sFileName, ".")
 
  '拡張子を除いたファイル名の取得
 sFileStr = Left(sFileName, lFindPoint - 1)

 GetFNameFromFStr = sFileStr
End Function

Function addCol(buf As String, str As String, sep As String) As String
 Dim pos1, pos2 As Integer
 Dim i, ix1, ix2 As Integer
 Dim items() As Variant, item As Variant
 Dim num As Integer
 
 num = 7  'G列の番号
 pos1 = 1
 ix1 = 0
 ReDim items(ix1)
  'sepでカラムを分割
 Do While pos1 <= Len(buf)
 pos2 = InStr(pos1, buf, sep, vbTextCompare)
 If pos2 < pos1 Then
 pos2 = Len(buf) + 1
 End If
 ReDim Preserve items(ix1)  '配列要素数を再設定
 items(ix1) = Trim$(Mid$(buf, pos1, pos2 - pos1))
  ' シングルクォーテーション、ダブルクォーテーションで囲まれている場合は両端文字を取り除く
 If (((Left$(items(ix1), 1) = """") And (Right$(items(ix1), 1) = """")) Or ((Left$(items(ix1), 1) = "'") And (Right$(items(ix1), 1) = "'"))) Then
 items(ix1) = Trim$(Mid$(items(ix1), 2, Len(items(ix1)) - 2))
 End If
 pos1 = pos2 + 1
 ix1 = ix1 + 1
 Loop
 
  'num列にstrを追加
 ix1 = 1
 For Each item In items
 If (ix1 = 1) Then
 addCol = item
 ElseIf (items(0) <> "" And ix1 = num) Then
 addCol = addCol & "," & str
 Else
 addCol = addCol & "," & item
 End If
 ix1 = ix1 + 1
 Next
 For i = ix1 To num
 If (items(0) <> "" And i = num) Then
 addCol = addCol & "," & str
 Else
 addCol = addCol & ","
 End If
 Next i
End Function

'1ファイル処理
Sub addFileName(path As String, fname As String)
 Dim buf As String, idx As String
 Dim fname2 As String, fname3 As String
 Dim x As Long
 
  'CSVファイル読み込み&書き込み
 fname2 = path & fname
 fname3 = path & fname & ".bak"
 Name fname2 As fname3
 Open fname3 For Input As #1
 Open fname2 For Output As #2
 Do Until EOF(1)
 x = Int((999999 - 100000 + 1) * Rnd + 100000)
 Line Input #1, buf
 buf = addCol(buf, str(x), ",")  '半角カンマ区切り以外の場合は第3引数を変更してください
 Print #2, buf
 Loop
 Close #2
 Close #1
End Sub

'ファイル探索+処理実行
Sub hogeConv(path As String, ext As String)
 Dim fcol As Object, re As Object
 Dim flist As Variant, remat As Variant
 Dim pat As String, fname As String
 Dim n As Long
 
  '処理対象ファイル探索+処理実行
 Set fcol = CreateObject("Scripting.FileSystemObject").GetFolder(path).Files
 Set re = CreateObject("VBScript.RegExp")
 pat = "\." & ext & "$"
 With re
 .Pattern = pat
 .IgnoreCase = True
 .Global = True
 For Each flist In fcol
 fname = GetFNameFromFStr(flist.name)
 Set remat = .Execute(flist.name)
 If remat.Count > 0 Then
 Call addFileName(path, flist.name)
 End If
 Next flist
 End With
 Set re = Nothing
 Set fcol = Nothing
End Sub

Sub main()
 Call hogeConv("C:/test/", "csv")
End Sub


inosisiさんのコメント
ありがとうございました うまくいきました '半角カンマ区切り以外の場合は第3引数を変更してください の意味がわからないのですが

oil999さんのコメント
CSVのカラム区切りは通常半角カンマ , ですが、 もしそれ以外の形式(例:タブ区切り)だったら変更してください という意味です。 巧く動作したのであれば、とくに変更する必要はありません。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ