Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
エクセルデータをCSVに転記保存したいです
投稿日時: 19/09/19 09:30:04
投稿者: y

エクセルデータをCSVにしたいのですが、うまくいきません。
すいませんが、教えてください。
 
エクセルのシートに
 D列 (品名) 文字と数字
 E列 (型式) 文字と数字
 F列  空白
 G列 (メーカ)文字
 H列 (数量) 数字
 I列 (備考) 文字と数字
 
が入っています。最終行は都度変わります。
下記の命令を入れたのですが、実行時エラー13
型が一致しませんとメッセージがでます。
いろいろ変更してみたのですが、10行目で
引っかかります。
どのようにしたらCSVに書き出しできるので
しょうか。よろしくお願いいたします。
 
Sub CSV()
  
 Dim res As String
      
      res = MsgBox("CSVにしますか?", vbYesNo)
       
        If res = vbYes Then
         
         Dim sheet As Worksheet
         Dim endCel As Range
         Dim bookpath As String
         Dim strCsvFile As String
          
         Set sheet = ActiveSheet
         Set endCel = sheet.Range("A1").SpecialCells(xlLastCell)
          
         bookpath = ActiveWorkbook.Path
         strCsvFile = bookpath & "\" & sname & ".csv"
          
         Worksheets(sheet).Range("A1", endCel).Copy
         Worksheets.Add.Range("A1").PasteSpecial Paste:=xlPasteValues
     
         ActiveSheet.Move
         Application.DisplayAlerts = False
         ActiveWorkbook.SaveAs Filename:=strCsvFile, FileFormat:=xlCSV
         ActiveWorkbook.Close savechanges:=False
         Application.DisplayAlerts = True
     
     
            MsgBox "CSVに書き出しました"
            If S = vbOK Then
            ActiveSheet.Delete
                  
    End If
 
       If res = vbNo Then
       ActiveSheet.Delete
     
    End If
     
  End If
    
 End Sub
 
 
 
 
 
 

回答
投稿日時: 19/09/19 10:19:53
投稿者: mattuwan44

ん?
 
要は、今アクティブになっているシートを、CSVで保存したいのですか?
 
そうならば、
普通に名前を付けて保存→ファイル形式をCSVにして→OK
何かメッセージが出ても「はい」で進めばよくないですか?
 
あとは、ファイルを保存しないで閉じれば、元のファイルに変更した情報は残らないと思いますが。。。
 
それをさらに1クリックでという事なら、まずはマクロの記録をもう一度してみましょう。

回答
投稿日時: 19/09/19 10:33:29
投稿者: sk

引用:
strCsvFile = bookpath & "\" & sname & ".csv"

引用:
If S = vbOK Then

これらの変数がどこで宣言されているのか(されていないのか)、
どのタイミングでどのような値が格納されているのか、という点に
ついてはとりあえず置いておくとして。
 
引用:
Dim sheet As Worksheet

引用:
下記の命令を入れたのですが、実行時エラー13
型が一致しませんとメッセージがでます。

引用:
Worksheets(sheet).Range("A1", endCel).Copy

sheet.Range("A1", endCel).Copy

投稿日時: 19/09/19 10:43:14
投稿者: y

mattuwan44様
 
早々に回答頂き、ありがとうございます。
 
マクロでCSV保存したら、空白のA〜C列が消えてしまい
D列からのデータがA列からになってしまうので、範囲指定
してCSVに保存しようと思いました。
保存の仕方が悪いのでしょうか。
もし、よい方法がありましたら教えて頂けましたら助かります。
よろしくお願いいたします。

投稿日時: 19/09/19 11:25:38
投稿者: y

sk様
 
回答頂きありがとうございます!
 

引用:
strCsvFile = bookpath & "\" & sname & ".csv"

 
名前を間違えていました。sname ではなく sheet.Name でした。
 
引用:
If S = vbOK Then

 
宣言し忘れていました。 Dim S As String が抜けていました。
 
ご指摘頂いた箇所を修正したら、CSVにする事ができました!
 
次に質問なのですが、CSVを開いてみましたら、マクロで操作
した時と同じ、D列からではなくA列からデータが入っていました。
やはり、空白列を残す事はできないのでしょうか。
よろしくお願いいたします。
 
 

回答
投稿日時: 19/09/19 11:35:51
投稿者: mattuwan44

>マクロでCSV保存したら、空白のA〜C列が消えてしまい
>D列からのデータがA列からになってしまうので
 
まずは、手動でやってみてください。
それで、やはり空白が無くなるなら、
エクセル君の癖なので、それに応じた工夫が必要になるでしょう。
 
>A列から
↑これは再度、エクセルで開いたらということでいいですか?
 
ちょっと、どうあって欲しいかの仕様がつかめませんが、
強引にセルに「""」とか入れたらどうなるのかなぁ。。。
 
ちょっと時間なくて試せませんが^^;

回答
投稿日時: 19/09/19 11:59:37
投稿者: sk

引用:
マクロでCSV保存したら、空白のA〜C列が消えてしまい
D列からのデータがA列からになってしまう

引用:
次に質問なのですが、CSVを開いてみましたら、マクロで操作
した時と同じ、D列からではなくA列からデータが入っていました。
やはり、空白列を残す事はできないのでしょうか。

それらの列を残すことにどのようなメリットがあるかは分かりかねますが、
とりあえず以下のようなコードを挿入なさればよろしいのではないかと。
 
引用:
ActiveSheet.Move
Application.DisplayAlerts = False

ActiveSheet.Move
ActiveSheet.Range("A1").Value = "'"
Application.DisplayAlerts = False

投稿日時: 19/09/19 12:03:08
投稿者: y

mattuwan44様
 
すごいヒントを ありがとうございます!
 
A1〜C1 に 項目を入れる事で 項目以外空白列を
CSVでつくることができました。
本当に、助かりました。