LoginSignup
0
0

More than 3 years have passed since last update.

Excel VBAとPowershellで通貨単位を変える(英語のみ)

Posted at

コードはこんな感じ

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などのアルファベットで表記するほうが有効でしょう。外貨建預金でそういう表記を採用しているケースがあるのは、通貨単位や桁区切り文字で文字化けが起きることを回避しているものと考えられます。ただ、小数点がいくつか最初はわからないときは、この方法も使えるかもしれません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0