こんにちは。
当方マクロ初心者で、教本を片手にマクロを組んでいるレベルです。
宜しければご回答お願いします。
質問はタイトルにあるように、
「読み込んだcsvファイルの名前を別名保存のファイル名に使いたい」
ということです。
マクロ有効のエクセルファイル(abc.xlsm)に、csvファイル(123.csv)を取り込む
※GetOpenFilenameというマクロでcsvファイルを取り込んでいます(マクロボタンを設置)
↓
取り込んだcsvデータで集計等の作業をする
↓
作業が終わったマクロ有効エクセルファイル(abc.xlsm)を「別名をつけて保存」する
※この時、保存ダイアログボックスに読み込んだcsvファイルの名前が自動で付与される(123.xlsm)
ようにしたいです。
なお「別名をつけて保存」はエクセルファイル(abc.xlsm)上にマクロ実行用のボタンを設置して使用する予定です。
(ボタンで実行させるのはエクセルに不慣れな方も使用する為です)
説明が下手でやりたいことがうまく伝わっていないかもしれませんが、、、
よろしくご教授くださいませ。
No.1
- 回答日時:
やりたいことが見えない部分があります。
取り込んだCSV・・・は
abc.xlsmのシートにコピペしているの?
今のコードは公開できないのかな。
ということでファイル名の取り出しだけです。
Sub sample()
Dim FilePath As String, FileName As String, v As Variant, i As Integer
FilePath = Application.GetOpenFilename("CSV Files (*.csv), *.csv")
v = Split(FilePath, "\")
For i = LBound(v) To UBound(v) '以下3行イミディエイトウィンドウでの確認用
Debug.Print i & "__" & v(i)
Next
FileName = v(UBound(v)) '拡張子を含んだファイル名
Debug.Print "あり", FileName
FileName = Left(v(UBound(v)), InStrRev(v(UBound(v)), ".") - 1) '拡張子含まず
Debug.Print "なし", FileName
End Sub
No.2
- 回答日時:
こんにちは。
>説明が下手でやりたいことがうまく伝わっていないかもしれませんが、、、
というよりも、やはり内容的には製作依頼になってしまいますね。
ただ、誰が作ったものであれ、他人の作ったものですと「なくて七癖」で違いが出てきて、「これは何?」とか、不本意なものがあるかもしれません。一応、事前に、ご知らせさせていただます。
・以下のマクロの特徴
拡張子の選択は、一応、ご要望通り、'xlsm' は選択できますが、もしない場合はそうではない場合は、標準の 'xlsx' に戻ってしまいます。基本的には、'xlsx' で良いのではないかと思います。
自動化のため、最初のファイルの選択(GetOpenFileName)以外の、保存時のダイアログ型はやめました。
>csvファイルの名前が自動で付与される(123.xlsm)
もし同名のファイルがあった場合は、自動的に枝番が付きます。言い換えると、既存のファイルの上書きをしないということにしました。
>マクロ有効のエクセルファイル(abc.xlsm)に、csvファイル(123.csv)を取り込む
これ自体は変わりませんが、取り込んだCSVファイルは、残す・残さないの選択は可能です。
'.Copy 'シートを残す場合
.Move '追加したシートを分離
現行では、分離-残さないという選定になっています。
'//
Sub CSVImport()
Dim fn As Variant
Dim outFn As Variant
Dim fNum As Integer
Dim i As Long, buf As Variant
Dim TextLine As String
Dim myArray
Dim lngCount As Long
Dim BaseFn As String, orgBaseFn As String '基幹ファイル名
Dim strFilter As String
Dim myPath As String
Dim fFormat As Integer
'拡張子の選択
'拡張子の選択
Dim EXTE As String: EXTE = ".xlsm"
If StrComp(EXTE, ".xlsm", vbTextCompare) = 0 Then
fFormat = xlOpenXMLWorkbookMacroEnabled '52
Else
fFormat = xlOpenXMLWorkbook '51
EXTE = ".xlsx"
End If
On Error GoTo ErrHandler
'ファイル選択ダイアログ
fn = Application.GetOpenFilename("CSVファイル(*.csv),*.csv", Title:="ファイル選択")
If VarType(fn) = vbBoolean Then Exit Sub
'ベースファイル名を取得
myPath = Left(fn, InStrRev(fn, "\"))
outFn = Dir(fn)
BaseFn = Left(outFn, InStrRev(outFn, ".") - 1)
orgBaseFn = BaseFn '変更用のために確保
'ファイル・テキストインポート
fNum = FreeFile()
Open fn For Input As #fNum
With ActiveWorkbook
.Worksheets.Add After:=Worksheets(Worksheets.Count)
End With
With ActiveSheet
Application.ScreenUpdating = False
Do While Not EOF(fNum)
Line Input #fNum, TextLine
If Len(TextLine) > 1 Then
lngCount = lngCount + 1
myArray = Split(TextLine, ",") 'デリミタは、「,」
.Cells(lngCount, 1).Resize(, UBound(myArray) + 1).Value = myArray
End If
Loop
Close #fNum
Application.ScreenUpdating = True
'.Copy 'シートを残す場合
.Move '追加したシートを分離
End With
With ActiveWorkbook
'出力ファイル名
'ファイル名の重複を避ける
buf = Dir(myPath & BaseFn & EXTE)
Do Until buf = ""
i = i + 1
BaseFn = orgBaseFn & "_" & CStr(i)
buf = Dir(myPath & BaseFn & EXTE)
Loop
.SaveAs myPath & BaseFn, fFormat
.Close False
End With
MsgBox BaseFn & EXTE & "の保存終了", vbInformation
Exit Sub
ErrHandler:
MsgBox Err.Number & ": " & Err.Description
End Sub
'///
No.3ベストアンサー
- 回答日時:
1. とあるマクロ付きブック (仮に macro.xlsm) がある。
こいつは CSV を何らか処理するためのブックである。2. とある csv ファイル (仮に 20150101.csv) がある。
3. macro.xlsm から 20150101.csv を開き、CSV に書かれているデータを読み取って macro.xlsm 自体のシート上に何らかの転記処理をする。
4. 処理が終わったら macro.xlsm 自身を別名保存する。 ファイル名は読み込み元の CSV ファイルにならって 20150101.xlsm にしたい。
5. 以後、次の CSV を処理する際も macro.xlsm を使って処理を行っていく。
という感じでしょうか。
CSV ファイルを開く際、CSV ファイルの名前を変数にとっておく。
→ 標準モジュールの public 変数にでも入れておく。
→ "名前を付けて保存" の処理と同じ標準モジュールにあるのなら public じゃなくて private な変数でも良い。
または
CSV ファイルを開く際に CSV ファイルを Workbook オブジェクトとして参照しているのなら、その変数の Name プロパティに格納されている。
以下のような変数に CSV ファイルのファイル名 (パスでも可能) を突っ込むと拡張子なしのファイル名を取得できます。
ex.) hoge.csv やら d:\test\hoge.csv やら \\server\aaa\hoge.csv → "hoge"
Function GetCsvBasename(aCsvFileName As String) As String
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim baseName As String
baseName = fso.GetBaseName(aCsvFileName)
GetCsvBasename = baseName
End Function
ただし xlsm ファイルを SaveAs で保存する際は FileFormat 引数に "xlOpenXMLWorkbookMacroEnabled" を指定しなくてはなりません。。
ThisWorkbook.SaveAs "csv ファイル名", xlOpenXMLWorkbookMacroEnabled
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルでcsvファイルを開いてVBAを使いたい 7 2022/04/28 11:12
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/02/21 13:29
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/21 09:28
- Excel(エクセル) 【マクロ】webアドレスにて指定されたCSVファイル【excelソフト表示】を印刷する件 1 2023/02/15 01:52
- Excel(エクセル) Excelのマクロコードについて教えてください。 1 2022/03/27 10:47
- Access(アクセス) CSVファイルの「0落ち」にVBA 6 2023/02/02 15:27
- Excel(エクセル) 【マクロ】マクロが保存されているエクセルとは、別のエクセルのオートフィルターのしぼりをクリアーしたい 2 2022/12/24 08:36
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/02/21 11:19
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/01/27 13:15
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/08 11:02
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
【Excel VBA】取り込んだファイルのファイル名を取得するには?
Visual Basic(VBA)
-
EXCEL VBA ー 同一フォルダ内のCSVファイル名を変更
Excel(エクセル)
-
ファイル名を今日の日付、時刻で保存する
Visual Basic(VBA)
-
-
4
【Access】クエリで抽出したデータをCSV形式でエクスポートできますか?
Access(アクセス)
-
5
access vbaでCSVファイルを文字列にしてエクスポートする方法
Visual Basic(VBA)
-
6
マクロの「SaveAs」でエラーが出るのを解消したいです(再)
Visual Basic(VBA)
-
7
【Excel VBA】CSV取込時、数字の先頭の0を消えないようにするには?
Excel(エクセル)
-
8
ExcelをCSV書き出す場合のシート名を変更したい
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
カンマ区切りのCSVファイルから...
-
VBAでcsvファイルを読み込んで...
-
複数のcsvファイルをExcelに一...
-
csvファイル 項目数取得
-
Visual C++によるcsvファイルの...
-
Excelでcsvのフィールドが減る
-
データ解析ソフトRでのファイル...
-
vb2010でCSVファイルを並び替え...
-
CSVの読み込み処理について
-
Csvから1行ずつ変数に格納する...
-
csvファイルのデータの一部を取...
-
巨大なCSVの加工(指定列のみの...
-
CSVファイル作成
-
バッチでCSVを処理する時、空の...
-
COBOL85でのCSVファ...
-
マクロから出力されるcsvのダブ...
-
CSV形式での保存時に”文字列...
-
CSVファイルを折れ線グラフ化す...
-
csvファイルでの日付設定「yyyy...
-
エクセル形式のファイルの読み込み
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カンマ区切りのCSVファイルから...
-
CSV形式での保存時に”文字列...
-
複数のcsvファイルをExcelに一...
-
csvファイル 項目数取得
-
csvファイルでの日付設定「yyyy...
-
バッチでCSVを処理する時、空の...
-
マクロから出力されるcsvのダブ...
-
csvファイルを列数ごとに分割す...
-
csvファイルのデータの一部を取...
-
エクセル形式のファイルの読み込み
-
エクセルVBA 大容量CSVファイル...
-
CSVファイル作成
-
EXCEL|csvで保存→開くcsvを閉じる
-
CSVファイルの項目行を削除...
-
巨大なCSVの加工(指定列のみの...
-
データ解析ソフトRでのファイル...
-
VBAでCSVファイルのデータを集...
-
【ExcelVBA】UTF-8の文字コード...
-
【C#】パス名で無効な文字
-
【エクセル マクロ】読み込ん...
おすすめ情報