初めて投稿します。
エクセルのマクロ初心者の質問です。
CSVファイルを読み込み、そこにあるデータを今現在開いているシートへ貼り付けを行う際に、一度目は特に問題ないのですが、隣のシートを開いて再度実行すると、何故か同じような貼り付けにならずにAセルからPセルに入っている文字列が全てAセルに結合されたような形で貼付けされます。
一度ファイルを閉じて再度開き、実行すると問題はないのですが、なにかコードが間違っているのでしょうか?
マクロ初心者で、頓珍漢な事を言っているかもしれませんが、どなたかお知恵をお貸しください。
よろしくお願いします。
Sub データー抽出()
Dim csvfilename As String
csvfilename = Application.GetOpenFilename("CSV ファイル , *.csv")
Workbooks.Open Filename:=csvfilename
' Copy CSV File
LastRow = Range("A65536").End(xlUp).Row
Range("A1:P" & CStr(LastRow)).Select
Selection.Copy
Application.DisplayAlerts = False
ActiveWindow.Close
Application.DisplayAlerts = True
' Paste
Range("A1").Select
ActiveSheet.Paste
No.1ベストアンサー
- 回答日時:
こんにちは。
私の印象としては、
ActiveSheet.Paste
ふつうなら、クリップボードに保存したものは、その前にExcelの中で大きな作業をする(保存やクローズ)と消えてしまうような気がしましたから、これが実行できること自体が意外なのです。それで、コード自体は問題ないとは思うのですね。
まあ、私ごときの技術で、人のコードの良い悪いなんていうのは、分不相応かもしれませんが、内容的には、その問題さえなければ、満点だと思います。
原因なのですが、たぶん、[データ]-[区切り位置]のユーティリティが初期化されていないのが原因ではないか、と思いました。まず、その部分をダミーを使って戻してみてください。(図を付けました)
最初に書いたように、クリップボードそのものよりも、コピーしたものがオブジェクトである以上は、その中身が問題になってくるわけです。
わたし流に書けば、また違うコードになりますが、それは後にします。
マクロの提案としては、
1. CSVファイルを開けて、
2. その範囲をコピーして
3. そのブックを閉じて
4. そして、アクティブになったシートに貼り付ける
この4と3を入れ替えたらどうか、という提案をしたいのです。直接の原因には触れていませんから、解決策にはなりませんが。
こんな感じです。
'//
Sub データ抽出2()
Dim Csvfilename As String
Dim AcSheet As Worksheet
Dim LastRow As Long
Dim myRng As Range
Set AcSheet = ActiveSheet
Csvfilename = Application.GetOpenFilename("CSV ファイル , *.csv")
With Workbooks.Open(Filename:=Csvfilename)
LastRow = .ActiveSheet.Range("A65536").End(xlUp).Row
Set myRng = .ActiveSheet.Range("A1:P" & CStr(LastRow))
myRng.Copy AcSheet.Range("A1")
Application.DisplayAlerts = False
.Close
Application.DisplayAlerts = True
End With
End Sub
'//
'-------------------
私のやり方も、あくまでもトレーニングとして考えてみました。
もともと、Open fn ~ For Input As は、わたしのテンプレートに入れてあったので、そのまま抜き出しました。複数のものをインポートできますが、最近は、ネットからダウンロードしたファイルは、UTF-8 のCSVファイルがあるので、しんきちさんのようなスタイルのほうがベターなのようです。あくまでも、以下は、SJISを元にした造りになっています。そのために、UTF-8 to SJIS 変換プログラムを入れるとしたら、かなり大掛かりになってしまいます。
'//
Sub CSVImport()
Dim Fname As Variant, fn As Variant
Dim FNo As Integer
Dim TextLine As String
Dim Ar As Variant
Dim i As Long, j As Long, indx As Long
'複数選択有り
Fname = Application.GetOpenFilename("CSV ファイル , *.csv", , , , True)
If TypeName(Fname) <> "Variant()" Then
Exit Sub
End If
For j = 1 To UBound(Fname)
i = 1 '貼り付け開始行
FNo = FreeFile()
fn = Fname(j)
Open fn For Input As #FNo
Application.ScreenUpdating = False
Do While Not EOF(FNo)
Line Input #FNo, TextLine
Ar = Split(TextLine, ",")
Cells(i, 1).Resize(1, UBound(Ar) + 1).Value = Ar
i = i + 1
Loop
Close #FNo
indx = ActiveSheet.Index
If j < UBound(Fname) Then '自動的に次のシートを開けるか、増やす
If indx < Worksheets.Count Then
Worksheets(indx).Next.Select
Else
Worksheets.Add After:=Worksheets(Worksheets.Count)
End If
End If
Application.ScreenUpdating = True
Next j
End Sub
WindFallerさんへ
詳しい説明付きでとても助かりました。
2日間モヤモヤしてた気持ちが一気に晴れた気分です。
マクロは始めたばかりなのでこれからも質問することが多くなると思いますが、自己練磨して頑張ります。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Excel(エクセル) エクセルのマクロでコピー後の貼り付け先を毎回指定したところにしたい 5 2022/08/12 10:47
- Excel(エクセル) エクセルのマクロについて教えてください。 3 2023/02/07 14:47
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/04 17:58
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルの指数を無効にしたい
-
複数のCSVファイルを横に並べて...
-
大量のCSVデータを1つのエ...
-
【エクセル VBA】CSVファイルの...
-
VBAでCSVの1行目だけを書き換え...
-
VBAでユーザーフォーム上に参照...
-
EXCELにcsv形式の外部データを...
-
「ほかのアプリケーションを無...
-
複数の同じ様式のエクセルデー...
-
エクセル終了時の保存確認メッ...
-
フォルダ内の全ブックのシート...
-
エクセルVBA Workbook変数に変...
-
複数のデータ系列の線の太さを...
-
エクセルでツールバーに「縮小...
-
cellsで特定の離れた範囲を選択...
-
別のパソコンでエクセルのマク...
-
エクセルマクロにてパワーポイ...
-
VBAを一度起動するとずっと出て...
-
昨日まで動いていたエクセルの...
-
Excel VBAで、実行時にsheet上...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数のCSVファイルを横に並べて...
-
エクセルの指数を無効にしたい
-
excelインポート時の「実行時エ...
-
VBAでCSVの1行目だけを書き換え...
-
大量のCSVデータを1つのエ...
-
EXCELにcsv形式の外部データを...
-
CSVファイルの結合(重複データ...
-
Excel VBAを使った複数のCSVフ...
-
複数のcsvファイルを1つのEXCEL...
-
「ほかのアプリケーションを無...
-
二つのCSVファイルを照らし合わ...
-
EXCELLの動きが遅い
-
同じ形のCSVファイルを複数同時...
-
datファイル→csvファイル→datフ...
-
【VBA初心者】同じフォルダ内の...
-
VBAでユーザーフォーム上に参照...
-
複数個のascファイルを1つ...
-
【エクセル VBA】CSVファイルの...
-
破損したExcelファイルの内容を...
-
エクセルファイルのコンペア
おすすめ情報