コードはこんな感じ
Option Explicit
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
Sub test()
Dim cmdStr As String
Dim strResult As String
Dim CultureString As String
Dim CurrencyValue As Currency
CultureString = "'de-DE'" '小文字-大文字にすること、シングルクォーテーションで囲んでからダブルクォーテーションで囲むこと
CurrencyValue = 1200 'できる限り数字の形式で
cmdStr = "$(" & CurrencyValue & ").tostring('C', [cultureinfo]" & CultureString & ") "
' PowerShellの実行(Execコマンド使用バージョン)
strResult = ExecPowerShell(cmdStr)
Debug.Print strResult
'ActiveCell.Value = "'" & strResult ' こちらを使うときもあるかもしれない。ただし、シングルクォーテーションを除去しにくい
ActiveCell.Value = strResult
strResult = RunPowerShell(cmdStr)
Debug.Print strResult
End Sub
' **************************************************
' PowerShellの実行(Execコマンド使用バージョン)
' **************************************************
Private Function ExecPowerShell(cmdStr As String) As String
' WshShellオブジェクト
Dim oExec As Object
' Execコマンドで実行する
' -NoLogo 著作権の見出しを出さない
Set oExec = CreateObject("Wscript.shell").Exec("Powershell -NoLogo Set-ExecutionPolicy RemoteSigned -Scope Process -force; " & cmdStr)
' ジョブが実行中(0)の間は、スリープしながら完了(1)まで待つ
Do While oExec.Status = 0
' 100ミリ秒
Sleep 100
Loop
' 標準出力取得
ExecPowerShell = oExec.StdOut.ReadAll
End Function
PowerShell VBAでPowerShellを実行して結果を取得する(Exec編)
ここを参考にしています。
しかし、commandletを実行する場合ではないからでしょうか。
-Executionplicy
では値はかえらないので、Set-ExecutionPolicy
で実行権限も変えてセミコロンで区切っています。
しかし。。。
PowershellのWindowが開く上に遅いです。
さらに、現在のところExcelが日本語環境の場合、ドル以外は文字化けしてしまいます。フォントも文字化けを解消するものはないようです。なので、ほぼ実用性はありませんでした。
ただし
カンマ(コンマ)とピリオド(ドット)を逆にしたい−オプション-インターナショナル
文字列で返ってくるため、あまり意味はないのかもしれませんが、コンマとピリオドを逆にするには、上記のCをNに変えて、Cultureinfoをde-DE
とすると小数点以下2桁が付与されます。
ただし、セルの表示形式を文字列にしているか、ActiveCell.Value = "'" & strResult
を使ってシングルクォーテーションで文字列にする場合が考えられます。しかし
先頭の「'」(シングルコーテーション)を削除する
はききません。この変換をするとドル以外は基本的に文字列になり、数字には戻りません。ほかの通貨単位を付与すると文字列のままですし、コンマとピリオドを逆にすると文字列になっているためです。
なお、、この田中大先生のVBAはHasFormulaがあるので、2013以降です。それ以前の場合はここをIsformuala2010を使う必要があります。
なので、セルの表示形式は標準で、シングルクォーテーションは付与しないほうがいいようです。必要があるときだけ変えましょう。
また実際の解決方法は、Format,Text関数を使い、JPY,USDなどのアルファベットで表記するほうが有効でしょう。外貨建預金でそういう表記を採用しているケースがあるのは、通貨単位や桁区切り文字で文字化けが起きることを回避しているものと考えられます。ただ、小数点がいくつか最初はわからないときは、この方法も使えるかもしれません。