質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

2185閲覧

【test – sheet】のハイフンをVBA上で?に文字化けすることなく記述する方法を探しています。

astaeta

総合スコア1

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2023/09/27 20:26

実現したいこと

【test – sheet】 という文字列をVBAエディタに文字化けなしで表示させたい。

前提とエラー状況

エクセル2013で、xlsmファイルにてVBAマクロを記述しているのですが、VBAエディタ上で、【test – sheet】という定数をかきたいのです(【】除く)

【マクロによる業務効率を上げたい】
1.インポートするデータ一覧をシートに作成する。
2.シート名をダブルクリックして【test – sheet】に変更する。
3.xlsxファイルとして保存しなおし、業務システムに【test – sheet】シートの内容を読み込ませています。
ただ、毎日発生する作業のため、手動で毎回シート名をコピペするというのは時間の無駄になっています。

ALT+F11でVBAエディタを開き
インポート対象のデータをあらかじめ作成し、マクロで読み込み、シート名を【test – sheet】に変更する。というマクロを組みたいのです。むしろ完成しています。

ただ、コードは問題なくかけたのですが、【test – sheet】という名前をシート名につけて、処理しようとしたところ、「ハイフン」が文字化けするのです。

– ←文字化けするハイフン。今回使いたいハイフン。
- ←半角のハイフン
ー ←全角のハイフン。
※半角や全角ではなく、中間ぐらいのハイフンみたいなのです。

ALT+F11でVBAエディタを起動し、
ほかのsubプロシージャとかで使いまわせるように定数として下記のように一番上に記述しました。

【Public Const SheetName As String = "Create workflow ? template"】

すると、ハイフンが?に文字化けするのです。
普通の【-】ハイフンを使えばいいじゃないか?と思われるかもしれませんが、
システムにシートをインポートするのですが、インポート時にシート名としてこの文字化けするハイフンを使わないと駄目なようになっているのです。なので、現状文字化けしている【ハイフン】を使うしかありません。

【-】のハイフン等で置換すると、シート名が違うということで弾いてきます。

試したこと

ネットで調べて、VBAエディタの【ツール】→【オプション】→【エディタの設定】→フォントを明朝やメイリオといったいろいろなフォントに変えてみたりしましたが、ダメでした。

このハイフンを【?】にすることなく、【–】としてVBAエディタに記述する方法をご存じの方がおられませんでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

astaeta

2023/09/28 14:08

この文字enダッシュっていうのですね。 この文字が一体何なのかも調べる方法がわからず困っておりました。 情報ありがとうございました。
guest

回答3

0

ベストアンサー

【test – sheet】という名前をシート名につけて、処理しようとしたところ、「ハイフン」が文字化けするのです。

– ←文字化けするハイフン。今回使いたいハイフン。

  • VBAのモジュールにおいて、Unicode機種依存文字を文字列リテラルとして直接記述することは出来ない(インターフェースがUnicode機種依存文字の表示をサポートしていないため)。

  • 代替手段としては、ChrW 関数を使用してその文字を取得し、他の文字列リテラルと文字列連結させるのが一般的である。

vba

1Cells(1, 1).Value = "Create workflow " & ChrW(8211) & " template"

ほかのsubプロシージャとかで使いまわせるように定数として下記のように一番上に記述しました。
【Public Const SheetName As String = "Create workflow ? template"】
すると、ハイフンが?に文字化けするのです。

  • しかし、Const ステートメントによって定数を宣言する際、値を代入する式に変数や関数を使用することはできない

結論: VBAにおいて、Unicode機種依存文字を含む文字列を定数として宣言することは不可能である。

別解: 定数ではなくユーザー定義関数として定義する。

vba

1Private Sub Test() 2 3 '新規ブックを作成し、1つめのワークシートの名前を設定する 4 Workbooks.Add.Worksheets(1).Name = TemplateSheetName 5 6End Sub 7 8Function TemplateSheetName() As String 9 10 TemplateSheetName = "Create workflow " & ChrW(8211) & " template" 11 12End Function

投稿2023/09/28 05:47

編集2023/09/28 05:55
sk.exe

総合スコア1059

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

astaeta

2023/09/28 14:19

ありがとうございます。 非常にわかりやすかったです。 なぜ定数として使えないのかも書いていただき納得できました。 ご提示いただいたユーザー定義関数を参考にさせていただいた結果、下記コードでデータの読み込みに成功しました。 大変助かりました。本当にご丁寧に解説していただきありがとうございました。 Sub CSV取り込みSHIFTJIS() Dim SettingFileName, targetShitJIS_sheet As Variant targetShitJIS_sheet = TemplateSheetName MsgBox targetShitJIS_sheet Sheets(targetShitJIS_sheet).Cells.Clear SettingFileName = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", _ Title:="CSVファイルの選択") If SettingFileName = False Then Exit Sub End If With Sheets(targetShitJIS_sheet).QueryTables.Add(Connection:="text;" & SettingFileName, Destination:=Sheets(targetShitJIS_sheet).Range("A1")) .TextFilePlatform = 932 'SHIFTJIS .AdjustColumnWidth = False '列の幅を自動計算しない .TextFileCommaDelimiter = True 'コンマ区切り .Refresh BackgroundQuery:=False 'シートに出力 .Delete End With Sheets(targetShitJIS_sheet).Activate End Sub 'Create workflow ? template シート名を記入。 ' Function TemplateSheetName() As String TemplateSheetName = "Create workflow " & ChrW(8211) & " template" End Function
guest

0

予め、テキストファイルに変更するシートの名前をUTF-8の文字コードで記述しておき、そのファイルを読み込んで、
その内容をシート名に設定する方法です。
マクロのあるブックと同じホルダに
sheet_name.txt という名称のファイルを作成します。
sheet_name.txtの1行目は
Create workflow – template
となっています。文字コードはUTF-8でBOM付きで保存します。
以下のマクロは上記のテキストファイルを読み込み、その内容で、Sheet1のシート名を
新しいシート名に変えます。シート名は、Create workflow – templateになります。

VBA

1Public Sub シート名変更() 2 Dim buf As String, Target As String 3 Target = ThisWorkbook.Path & "\" & "sheet_name.txt" 4 With CreateObject("ADODB.Stream") 5 .Charset = "UTF-8" 6 .Open 7 .LoadFromFile Target 8 buf = .ReadText(-2) 9 .Close 10 End With 11 Worksheets("Sheet1").name = buf 12End Sub 13

投稿2023/09/28 04:41

tatsu99

総合スコア5533

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

astaeta

2023/09/28 14:16

ファイル名にシート名の名前を書いておく方法のご提示ありがとうございます。 ただ、シートを作成することが目的ではなく、【Create workflow – template】シート名にデータを読み込むという作業が最終目標なのです。提示いただいたコードで読み込みプログラムを考えてみたのですが、自分で作成することができませんでした。 ご提示いただいたのにすみません。
guest

0

直接的な回答にはなりませんが、解決法の一案です。
1.インポートするデータ一覧をシートに作成する。
2.シート名をダブルクリックして【test – sheet】に変更する。
3.xlsxファイルとして保存しなおし、業務システムに【test – sheet】シートの内容を読み込ませています。
ということですが、
シート名をSheet1などにしておいて、xlsxファイルとして保存しなおし、
その後、pythonを使って、シート名を【test – sheet】に変更する。
ということでは、いかがでしょうか。pyhtonならutf-8でスクリプト記述できますので、【test – sheet】は
文字化けしません。
「シート名をダブルクリックして【test – sheet】に変更する。」手間と、pythonのスクリプトを実行する手間とで
たいした違いはないといえば、それまでになりますが・・・・。
python で「インポートするデータ一覧をシートに作成する。」ことも含めて、行うようにすれば、
pythonの実行だけですみますので、手間は減ります。

とりあえず、以下は、シート名をSheet1からCreate workflow – templateに変えるスクリプトです。
python3で作成しています。(文字コードはutf-8で作成すること)
ブック名はあなたの環境に合わせて適切に設定してください。

python3

1import openpyxl as px 2# Sheet1をCreate workflow – template に変更する 3pathname = "D:/goo/data9/0001支店.xlsx" 4oldname = "Sheet1" 5newname = "Create workflow – template" 6wb = px.load_workbook(pathname) 7ws = wb[oldname] 8ws.title = newname 9wb.save(pathname) 10

投稿2023/09/28 03:06

tatsu99

総合スコア5533

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

astaeta

2023/09/28 14:12

解決方法の一案ご提示ありがとうございます。 パイソンを使うとそういう方法になるのですね。 ただ、今回VBAで動かしているので、途中で違う言語を挟んでしまうと、どこまでを「パイソン」「どこからをVBA」と考えることにもなり、障害時、私本人しかメンテナンスができなくなってしまう可能性がでてしまうためできればVBAで済ませたかったのです。 pythonコードのご提示ありがとうございます。 大変参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問