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

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

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

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

Q&A

2回答

5151閲覧

外字エディタで作成された漢字が混在するデータをvbaのstring関数で処理する方法,考え方は?

ThKong

総合スコア0

VBA

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

0グッド

0クリップ

投稿2021/01/04 12:37

前提・実現したいこと

  1. 番号リスト 番号リストvbaのstring関数を用いて,指定したシート内の名前データ※(漢字/外字エディタで作成された漢字も含む)からフォルダ名・ファイル名を自動作成したい。(している。)
  2. 番号リストしかし,名前データに外字エディタで作成された漢字が混在しているとコードが当初予期した目的と異なるエラー処理A(同じフォルダ名があれば,削除して実行してください)に入ってしまう。
  3. 番号リスト名前データ内に外字が混在してもエラー処理Aに入ることなくプログラムが最後まで実行されるようにしたい。

※ ソースコード中のm.cells(i.5)の部分

質問したいこと。

  • リストExcelファイル内のデータ(漢字による名前)をそのまま用いて,フォルダ名とファイル名にしたいと考えています。一応,マクロを組めたのですが,データに外字エディタで作成された文字が混じっていた場合に,プログラムが止まります。(予定していないエラー処理Aに入ってしまう。)
  • リストエラー処理に入らないようにするには,どのようなコードを書けばよいのでしょうか?また,解決する考え方はどのようなものなのでしょうか?

該当のソースコード

vba

1Sub FaceSheet() '●●シート作成 2 3 '前処理 4 5 Application.ScreenUpdating = False 6 7 8 9 '前処理 変数宣言 10 11 Dim full_path As String ' 作成するフォルダーのフルパス 12 Dim i As Long 13 Dim ey As String '西暦 14 Dim eey As String '元号 15 Dim SID As String '顧客aa管理番号 16 Dim na As String 'na は顧客名 17 Dim m As Worksheet 18 Dim RC As Integer 19 20 '前処理 メッセージボックで操作確認をする 21 RC = MsgBox("●●シートを作成しますか?", vbYesNo + vbQuestion, "確認") 22 23 24 If RC = vbNo Then 25 MsgBox "●●シート作成は,キャンセルされました" 26 Exit Sub '●●シート作成のキャンセル 27 28 Else 29 30 End If 31 32 MsgBox ("しばらくお待ちください。") 33 34 35 36 37 '個別シートとフォルダの作成 38 39 With Sheets("Face Sheet") 40 ' m.UsedRange.SpecialCells (xlCellTypeVisible) '可視セルのみにしたいができない。 41 42 43 For i = 2 To m.Cells(Rows.Count, 1).End(xlUp).Row 44 na = m.Cells(i, 5) 45 SID = m.Cells(i, 1) 46 On Error GoTo myError 'エラー処理 47 48 **MkDir ThisWorkbook.Path & "\" & SID & "_【 " & na & " 】_●●フォルダ" **'個人フォルダの作成 49 **__**full_path = ThisWorkbook.Path & "\" & SID & "_【 " & na & " 】_●●フォルダ" 'フルパスの取得**__** 50 51 ' 実行部分① Face Sheetへの基本事項入力 52 53 54 .Range("C7") = m.Cells(i, 5) ' 漢字名 55 .Range("C6") = m.Cells(i, 6) 'ふりがな名 56 .Range("H7") = m.Cells(i, 11) '顧客bb名 57 .Range("G6") = m.Cells(i, 7) '性別 58 .Range("H6") = m.Cells(i, 8) '生年月日 59 .Range("C8") = m.Cells(i, 9) & m.Cells(i, 10) '住所 60 61 '実行部分② A1からB3までの年次シートを 必要人数分コピーする。 62 63 Application.DisplayAlerts = False 64 Sheets(Array("入力シート", "Face Sheet", "A1", "A2", "A3", "A4", "A5", "A6", "B1", "B2", "B3", "カテゴリリスト")).Copy 65 ActiveWorkbook.SaveAs full_path & "\" & SID & "_" & "【 " & na & " 】" & "_●●シート" & ".xlsm", xlOpenXMLWorkbookMacroEnabled 66 67 68 ActiveWorkbook.Close savechanges:=True 69 70 71 72 Next i 73 74 75 76 '後処理 Face Sheet雛形の値クリア 77 78 79 .Range("A4").Clear 80 .Range("A5").Clear 81 .Range("A1").MergeArea.ClearContents 82 .Range("C6").MergeArea.ClearContents 83 .Range("C7").MergeArea.ClearContents 84 .Range("C8").MergeArea.ClearContents 85 .Range("H6").MergeArea.ClearContents 86 .Range("H7").MergeArea.ClearContents 87 End With 88 89 Call beep 90 91 Application.ScreenUpdating = True 92 MsgBox "完了しました" 93 Exit Sub 94 95 96myError: 97 98'Call BeepAPI(262, 600) 'ド 99'Call BeepAPI(262, 600) 'ド 100MsgBox "既に同じ名前のフォルダがあるので新規に作れません。" & Chr(13) & "先に作ったフォルダを消去してもう一度②を実行させてください。" 101 102 End Sub 103コード

試したこと

ExcelはUnicode,vbaはshift-jis とコードシステムが異なることは理解しました。検索しましたで外字判定をすることはできました。Like "[" & Chr(&HF040) & "-" & Chr(&HF9FC) & "]" しかし,外字エディタで作成された漢字はスルーされます。

補足情報(FW/ツールのバージョンなど)

Excel 2013です。

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

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

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

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

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

guest

回答2

0

まずは、
On Error GoTo myError 'エラー処理
をコメントアウトして(エラー処理を無効にして)から、実行してください。
そのとき、どの行でエラーにでるのか、また、エラーメッセージを回答に追記してください。

また「vbaのstring関数を用いて,」とのことですが、提示のコードではstring関数は使われてませんが、
これはどういうことでしょうか。

投稿2021/01/05 02:08

編集2021/01/05 02:15
hatena19

総合スコア33715

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

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

ThKong

2021/01/05 11:29

応答に心より感謝します。 指示通り,エラー処理を殺して実行させました。 結果は,エラー処理有効時と同じところ(同じ名前データのところ)で”pathが見つかりません”というエラーメッセージを吐いて止まります。 MkDir ThisWorkbook.Path & "\" & SID & "_【 " & na & " 】_●●フォルダ" '個人フォルダの作成 の箇所です。 ローカルウィンドウには, : na : "?田 " : String と,na変数の中身が示されています。 ? は 元データでは,外字エディタで作成された(おそらく)「梅」という字の異体字「梅」です。 ※string関数の下りはお笑いください。変数宣言で na を string型に宣言したことを自分はそう思い込んでいただけです。初心者なので,用語の理解も曖昧です。→いい加減。 また,お時間のある時に教えていただければ幸いです。
hatena19

2021/01/05 11:46

当方でサンプルを作成して外字を含むパスで MkDir したときは特にエラーにならずにフォルダーを作成できました。パスに含むことができない文字が含まれているとかはないですか。 ファイルやフォルダーの名前に使用できない文字 https://faq.nec-lavie.jp/qasearch/1007/app/servlet/qadoc?QID=008744
ThKong

2021/01/05 13:05

早速のご返答,本当に感謝です。 そうなんですか,できるのですね。サンプルまで作って試してもらい本当にありがたいです。 ”ファイルやフォルダーの名前に使用できない文字”は,名前データの”元”にはありません。 しかし,先ほどもコメントしたように梅の異体字が na変数に入った時に,"?"となっていて,"pathが見つからない"というエラーメッセージと共に止まります。 他にも”海”の異体字でも。どちらも外字エディタで作成されたもののようなのです。
hatena19

2021/01/06 00:12 編集

他の方の回答にもあるとようにVBAの文字列はUnicodeですが、VBE(vbaエディタ)はUnicodeに対応していないのでshift-jisないUnicode文字は?表示になります。ただしVBE上だけですので、VBAで使えないわけではないです。 > 外字エディタで作成された(おそらく)「梅」という字の異体字「梅」です。 この異体字「梅」は外字ではないです。shift-jisにないUnicode文字です。 VBAの文字列(String型)はUnicodeですが、VBAの関数やステートメントにはまれにUnicodeに対応していないものがあります。MkDirステートメントもその一つです。 FileSystemObjectを使ってフォルダーを作成すればshift-jisにないUnicode文字(異体字「梅」)を含んでいてもエラーにならずに作成できます。使い方は下記を参照してください。 Office TANAKA - FileSystemObject[CreateFolderメソッド] http://officetanaka.net/excel/vba/filesystemobject/filesystemobject05.htm
ThKong

2021/01/05 22:43

おはようござます。遅くまで解決方法を考えてもらって感謝です。 回答を読むだけで,知識が拡がります。FSOは,初めに挑戦していたのですが,今ひとつ上手くいかずMkdirコマンドで処理していました。 帰宅して,もう一度挑戦してみます。 また,迷ったらお力を貸していただければ幸いです。
guest

0

>ExcelはUnicode,vbaはshift-jis とコードシステムが異なることは理解しました。

これは誤解です。
vbaもUnicodeです。
shift-jisを使っているのは、VBE(vbaエディタ)だけです。

投稿2021/01/04 14:01

iruyas

総合スコア1067

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

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

ThKong

2021/01/04 22:15

無知なものですみません。理解を修正します。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問