2012-02-09 9 views
2

xlsファイルとxlsxファイルをcsvファイルに変換するVBScriptコードスニペットがあります。しかし、私は各セルをコンマではなくセミコロンで区切りたい。私のコンピュータでは、リストセパレータはコンマではなくセミコロンに設定されているので、Excelウィンドウを開いてcsvとしてセーブするとセミコロンで区切られます。しかし、私のVBScriptはカンマで区切られたcsvファイルを生成します。 VBScript(私は主にJavaプログラマ)をよく知らないので、コードスニペットをオンラインで見つけました。カンマではなくセミコロンでCSVファイルを区切るためにコードスニペットを変更するにはどうすればよいですか?VBScriptを使用してxlsをcsvに変換し、セミコロンで区切ります

if WScript.Arguments.Count < 2 Then 
WScript.Echo "Error! Please specify the source path and the destination. Usage: XlsToCsv SourcePath.xls Destination.csv" 
Wscript.Quit 
End If 
Dim oExcel 
Set oExcel = CreateObject("Excel.Application") 
Dim oBook 
Set oBook = oExcel.Workbooks.Open(Wscript.Arguments.Item(0)) 
oBook.SaveAs WScript.Arguments.Item(1), 6 
oBook.Close False 
oExcel.Quit 
WScript.Echo "Done" 

答えて

9

元のスクリプトを保存することができます。ローカル設定を適用する必要があることを示すパラメータを指定するだけです。これは私のCSVをaで保存します。セパレータ

if WScript.Arguments.Count < 2 Then 
    WScript.Echo "Error! Please specify the source path and the destination. Usage: XlsToCsv SourcePath.xls Destination.csv" 
    Wscript.Quit 
End If 
Dim oExcel 
Set oExcel = CreateObject("Excel.Application") 
oExcel.DisplayAlerts = FALSE 'to avoid prompts 
Dim oBook, local 
Set oBook = oExcel.Workbooks.Open(Wscript.Arguments.Item(0)) 
local = true 
call oBook.SaveAs(WScript.Arguments.Item(1), 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, local) 'this changed 
oBook.Close False 
oExcel.Quit 
WScript.Echo "Done" 
0

ファイルをFSOオブジェクトで再度開き、カンマ文字にReplace()を実行できます。

Const OpenAsDefault = -2 
Const FailIfNotExist = 0 
Const ForReading = 1 
Const ForWriting = 2 

Set oFSO = CreateObject("Scripting.FileSystemObject") 
Set fCSVFile = _ 
    oFSO.OpenTextFile("C:\path\file.csv", ForReading, FailIfNotExist, OpenAsDefault) 

sFileContents = fCSVFile.ReadAll 
fCSVFile.Close 
sFileContents = Replace(sFileContents, ",",";")) 

Set fCSVFile = oFSO.OpenTextFile("C:\path\file.csv", ForWriting, True) 
fCSVFile.Write(sFileContents) 
fCSVFile.Close 
+0

,,,,,,,,,, ExcelObj.Workbooks(1).SaveAsたcsvfile、6理由それはまた、 'John Doe、Euro、" 1,234.00 "'はJohn Doe、Euro; "1; 234.00" 'に解決され、おそらくユーザーが望むものではないでしょう。 – AutomatedChaos

+0

これがデータ型の場合は、明らかに役立たないでしょう。私がこれを投稿したときには、他の回答はなかったので、私は単に返事を出していました。 –

+1

もちろん。また、ユーザーがカンマなしのデータセットが限られている場合はうまくいきます。しかし、データを正しいCSVファイルに変換することは曖昧です。マイクロソフトでさえ、[rfc4180](http://tools.ietf.org/html/rfc4180)フォーマット定義に追いつかない。 – AutomatedChaos

1

区切られたテキストファイルにカンマを使用すると、地域設定でそのルーツが見つかります。コンマは米国で標準ですが、ドイツなどの国ではセミコロンを使用します。地域と言語設定でリストセパレータの値を変更し、Excelの[名前を付けて保存]ウィンドウからCSV(カンマ区切り)(.csv)を選択することができます。結果のファイルは、システム設定の値によって区切られます。このスクリプトは、デフォルトのリストセパレータ設定を変更します。次に、指定されたスプレッドシートを開き、それを再保存します。終了する前にシステム設定を以前の値に戻します。

2つのコマンドラインパラメータを受け入れます。最初のものは入力スプレッドシートです。 2番目はエクスポートされたファイルの出力ファイル名です。

strDelimiter = ";" 

strSystemDelimiter = ""   ' This will be used to store the current sytem value 
Const HKEY_CURRENT_USER = &H80000001 

' Get the current List Separator (Regional Settings) from the registry 
strKeyPath = "Control Panel\International" 
strValueName = "sList" 
strComputer = "." 
Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv") 
objRegistry.GetStringValue HKEY_CURRENT_USER, strKeyPath, strValueName, strSystemDelimiter 

' Set it temporarily to our custom delimiter 
objRegistry.SetStringValue HKEY_CURRENT_USER, strKeyPath, strValueName, strDelimiter 

' Open spreadsheet with Excel and save it in a text delimited format 
Const xlCSV = 6 

Set objExcel = CreateObject("Excel.Application") 
Set objWorkbook = objExcel.Workbooks.Open(WScript.Arguments.Item(0)) 
objWorkbook.SaveAs WScript.Arguments.Item(1), xlCSV 
objWorkbook.Close vbFalse   ' Prevent duplicate Save dialog 
objExcel.Quit 

' Reset the system setting to its original value 
objRegistry.SetStringValue HKEY_CURRENT_USER, strKeyPath, strValueName, strSystemDelimiter 

これは、Excelの[名前を付けて保存]ダイアログボックスでのみ有効で、コマンドラインや自動化では機能しないようです。 Excelのウィンドウを表示させるためにスクリプトを少し変更し、ショートカットキーを使用して、Excelインターフェイスを通じて[名前を付けて保存]ダイアログを開きます。これはトリックを行う必要があります。それはExcel 2007でVista x64で私のために働いた。私はこれがあなたのために働くことを願っています。

strDelimiter = ";" 

strSystemDelimiter = ""   ' This will be used to store the current sytem value 
Const HKEY_CURRENT_USER = &H80000001 

' Get the current List Separator (Regional Settings) from the registry 
strKeyPath = "Control Panel\International" 
strValueName = "sList" 
strComputer = "." 
Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv") 
objRegistry.GetStringValue HKEY_CURRENT_USER, strKeyPath, strValueName, strSystemDelimiter 

' Set it temporarily to our custom delimiter 
objRegistry.SetStringValue HKEY_CURRENT_USER, strKeyPath, strValueName, strDelimiter 

' Open spreadsheet with Excel and save it in a text delimited format 
Const xlCSV = 6 

Set objExcel = CreateObject("Excel.Application") 
objExcel.Visible = vbTrue 
Set objWorkbook = objExcel.Workbooks.Open(WScript.Arguments.Item(0)) 

WScript.Sleep 500     ' Delay to make sure the Excel workbook is open 
strWorkbookName = objExcel.ActiveWorkbook.Name 
strTitlebar = strWorkbookName 
Set WshShell = CreateObject("WScript.Shell") 
WshShell.AppActivate strTitlebar ' Make the workbook active so it receives the keystrokes 
WshShell.SendKeys "%fa"   ' Keyboard shortcuts for the Save As dialog 
WScript.Sleep 500 
WshShell.SendKeys "%tc{ENTER}" ' Change the Save As type to CSV 
If WScript.Arguments.Count > 1 Then 
    WshShell.SendKeys "+{TAB}" & WScript.Arguments.Item(1) 
    WScript.Sleep 500 
End If       ' This If block changes the save name if one was provided 
WshShell.SendKeys "{ENTER}"  ' Save the file 
WScript.Sleep 500 
WshShell.SendKeys "{ENTER}"  ' Dismiss the CSV warning dialog 
Set WshShell = Nothing 

objWorkbook.Close vbFalse   ' Prevent duplicate Save dialog 
objExcel.Quit 

' Reset the system setting to its original value 
objRegistry.SetStringValue HKEY_CURRENT_USER, strKeyPath, strValueName, strSystemDelimiter 
+0

ありがとう!しかし、コントロールパネルのコンピュータの区切り文字をセミコロンに変更しましたが、VBScriptを実行すると区切り記号としてカンマが使用されます。これはExcelで保存するとセミコロンで区切られるためです。これは、コントロールパネルの設定をクリックして変更するのではなく、コマンドラインからまったく同じことをするようです。しかし、私はこのスクリプトを試し、その結果をあなたに知らせます。 –

+0

ええ、私は同じ結果を得ました。それはコンマで区切られています。私は学校のコンピュータに乗っていて、レジストリキーを編集することを許可しないでしょうか?私は私の家のコンピュータにいるときに試してみる。私はこれが理由だと思っています。私は自宅で私の結果を知らせます。 –

+0

ルーク、私は問題を理解し、私の応答にいくつかの新しいコードを掲載しました。これはあなたのために働くはずです。 – Nilpo

1

関数の名前を付けて保存がそのように定義されている: .SaveAs(ファイル名、FileFormatは、パスワード、WriteResPassword、ReadOnlyRecommended、CreateBackup、ACCESSMODE、ConflictResolution、AddToMru、TextCodepage、TextVisualLayout、ローカル)

Thasであり、 (あなたの地域の言語オプションが正しく設定されている場合)、セミコロンを使用する

一貫したソリューションではありません真

+0

ありがとうございますが、このコードはもう必要ありません。どうもありがとうございました。 –

+0

ベストアンサーは... あなたが注意しなければならないのは、あなたのExcelのバージョンだけです。位置12の真はExcel 2013のために働きます Excel 2010の場合、ポジション10では2つの引数が少なくなります http ://msdn.microsoft.com/en-us/library/office/microsoft.office.interop.excel.dialogsheet.saveas.aspx そのコンテキストで... – WD11