半角・全角のスラッシュとアスタリスクを半角のみ認識させる方法

このQ&Aのポイント
  • テキストボックスに入力された値を元に、APIを使ってフォルダを生成するプログラムを作成しています。しかし、生成したい値の中に、フォルダに指定できない文字”/ : * ? " <> |”が存在することが分かりました。そこで、LIKE関数を使って半角のスラッシュだけを認識する方法を探しています。
  • 現在のプログラムでは、Me.strFullPath Like "*/*" のように*を用いてスラッシュを検索していますが、この方法では半角でも全角でもスラッシュが認識されてしまいます。スラッシュやアスタリスクを半角のみ認識させるためにはどのようにすれば良いでしょうか。
  • 具体的な方法についての例を教えていただけると助かります。
回答を見る
  • ベストアンサー

半角の"/"や"*"でプログラムを止めたいです。

Access2013です。 テキストボックスに入力された値を元に、APIを使ってフォルダを生成する プログラムを作成しています。 しかし、生成したい値の中に、フォルダに指定できない文字”/ : * ? " <> |”が あることが分かりました。 中には、スラッシュが半角、全角混ざっているものも有ります。 試験的に、LIKE関数で ”/”が含まれていたら止まるようにしてみたのですが Me.strFullPath Like "*/*" としたところ、半角、全角問わず、スラッシュと 認識してしまうことが分かりました。 作ってみたプログラムは以下の通りです。 If Me.strFullPath Like "*/*" Then MsgBox "パスに'/'が含まれている為、フォルダを作成できません。" Else Dim Ret As Long Ret = SHCreateDirectoryEx(0&, Me.strFullPath, 0&) If Ret = 0 Then MsgBox "フォルダを作成しました。" ElseIf Ret = 80 Or Ret = 183 Then MsgBox "既にフォルダがあります。" Else MsgBox "フォルダを作成できませんでした。" End If  End If このままだと、スラッシュが入っている場合。全角・半角問わず プログラムが止まりました。 LIKE関数にはこだわりませんが、スラッシュやアスタリスクなどを、半角だけ 認識させるには、どのようにしたら良いでしょうか。 出来ましたら、具体例をご教授願います。

  • jjj22
  • お礼率58% (17/29)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

> ダブルクォーテーションのみ、Instr関数に入れられなくて > 弾けなかったので、課題として残ってしまいました。 コードのリテラル文字列内("で囲まれている部分)では、ダブルクォーテーションは、"" と重ねます。 If InStr(1, Me.strFullPath, """",vbBinaryCompare) > 0 Then

jjj22
質問者

お礼

回答ありがとうございました。 最終的に、記号を判別する部分のみ、別のモジュールで 判別させることで、対応できました。 Function InStrCalc(ByRef strFullPathCheck As String) As Integer Dim InStrResult As Integer If InStr(1, strFullPath, "/", vbBinaryCompare) > 0 _ Or InStr(1, strFullPathCheck, "?", vbBinaryCompare) > 0 _ Or InStr(1, strFullPathCheck, "<", vbBinaryCompare) > 0 _ Or InStr(1, strFullPathCheck, ">", vbBinaryCompare) > 0 _ Or InStr(1, strFullPathCheck, "|", vbBinaryCompare) > 0 _ Or InStr(1, strFullPathCheck, "*", vbBinaryCompare) > 0 _ Or InStr(1, strFullPathCheck, """", vbBinaryCompare) > 0 _ Or InStr(1, strFullPathCheck, ":", vbBinaryCompare) > 0 Then  InStrResult = 1 Else    InStrResult = 0 End If End Function

jjj22
質問者

補足

ダブルクォーテーション出来ました。 ありがとうございます。回答No1で ダブルクォーテーションのみ、と書きましたが コロンを条件に加えると、コロンが無くても 反応してしまうようです。 コロンは、Option Compare Binaryで Like関数が対応できることを確認しました。 あまりスマートではないですが、別のモジュールを 呼び出すように変更しようかと思います。

その他の回答 (1)

回答No.1

第一案 Likeではなく、InStr関数を使って比較する。 If InStr(1, Me.strFullPath, "/",vbBinaryCompare) > 0 Then 第4引数に vbBinaryCompare を指定することで、全角、半角を区別して比較します。 第二案 モジュールの先頭部分に、デフォルトでは、 Option Compare Database Option Explicit と記述されている(2行目はない場合もある)が、それを下記のように変更する。 Option Compare Binary Option Explicit これで、Like で比較しても、全角、半角を区別するので、 If Me.strFullPath Like "*/*" Then のままでよい。 ただし、モジュール内の比較が、すべてバイナリーモードでの比較になるので注意が必要。

jjj22
質問者

お礼

回答ありがとうございます。 InStr関数で、/ : * ? <> |を弾くのは出来ました。 知識不足では有りますが、文字コードを判別して 数値計算を行っている部分があるので、モジュール内を 全てバイナリモードにするのは、不具合が出そうです。 ダブルクォーテーションのみ、Instr関数に入れられなくて 弾けなかったので、課題として残ってしまいました。

関連するQ&A

  • IFステートメントで半角でも全角でもtrueとさせ

    IFステートメントで半角でも全角でもtrueとさせるには? Sub test1() Dim str As String str = "ABC"’←全角のA If str Like "*A*" Then ’←半角のA MsgBox "Aがあります" End If End Sub これで、半角Aもメッセージを表示させたいのですが、 マッチバイトみたいなのってありますか?

  • vbsのFolderExistsで部分一致をさせたい

    VBSで以下のコードを作成しましたが動作しません。 ********動作しない************************** if (objFileSys.FolderExists("200810*")= True) then  msgbox "yes" else  msgbox "no" end if ********動作する************************** if (objFileSys.FolderExists("200810")= True) then  msgbox "yes" else  msgbox "no" end if 部分一致でフォルダが存在するかをしたいのですが、 どうしたらいいのでしょうか。 よろしくお願いします。

  • フォルダの中身が空白なのかを調べたい。

    こんばんは。 エクセル2003のvbaにて Sub test() If Dir("D:新しいフォルダ") = "" Then MsgBox "フォルダには何も入っていません" Else MsgBox "フォルダに何か入っています" End If End Sub で試してみたのですが フォルダに何か入っていても "フォルダには何も入っていません" と表示されてしまいます。 どうすればうまくいくのでしょうか? よろしくお願いします。

  • エクセル・時刻に関する質問

    添付画像のようなエクセルで以下の標準モジュールを作っています。 Sub test001() If Cells(2, 2) = TimeValue("9:00:00") Then MsgBox ("9:00:00認識しました") Else MsgBox ("9:00:00認識しませんでした。") End If If Cells(3, 2) = TimeValue("9:05:00") Then MsgBox ("9:05:00認識しました") Else MsgBox ("9:05:00認識しませんでした。") End If If Cells(3, 2) = 0.378472222222222 Then MsgBox ("2回目9:05:00認識しました") Else MsgBox ("2回目9:05:00認識しませんでした。") End If If Cells(4, 2) = TimeValue("9:10:00") Then MsgBox ("9:10:00認識しました") Else MsgBox ("9:10:00認識しませんでした。") End If If Cells(5, 2) = TimeValue("9:15:00") Then MsgBox ("9:15:00認識しました") Else MsgBox ("9:15:00認識しませんでした。") End If If Cells(6, 2) = TimeValue("9:20:00") Then MsgBox ("9:20:00認識しました") Else MsgBox ("9:20:00認識しませんでした。") End If End Sub 実行すると、9:05:00 だけが、「9:05:00認識しませんでした。」となります。 時刻以外は同じ内容のはずですが 9:05:00 だけ認識されません。 解決策をお願いします。

  • 【Excel VBA】A列の全角・半角文字をチェック

    【Excel VBA】A列の全角・半角文字をチェック Excel VBAの初心者です。 仕事で必要なため、教えていただけると助かります。 【やりたいこと】 Excel VBAで、入力が完了したExcelシートのA列(A1からA10)が、 半角のみであること、または全角が入力されていないこと、を チェックしたいです。 半角以外の文字があった場合は、メッセージを表示します。 また、半角以外のセルがあった場合は、そのセルの色を水色にします。 入力チェックの方法は、ボタンにマクロを登録して、 そのボタンを押下することで行います。 以下に、僕が試したプログラムを記します。 アドバイスをいただけると幸いです。よろしくお願いします。 Sub 入力チェック() Dim cellValue As String Dim strANSI As String Dim i As Integer For i = 0 To 10 cellValue = Cells(1, i + 1) strANSI = StrConv(cellValue, vbFromUnicode) If Len(cellValue) = LenB(strANSI) Then MsgBox "セルは半角のみ" myColor = 8 Else MsgBox "セルの内容は全角のみ" End If MsgBox "セルの内容は全角と半角があり" Next i End Sub

  • 乱数の利用

    僕の通う中学校では、乱数を利用してプログラムを作成することになりました。そしてプログラムを作りましたがステートメントがないと出てきます。どう解決すればよいでしょうか?これがプログラムです。 Dim a,b,c,d,e,f,g a=msgbox("幸せですか?",4) if a=6 then const b="運勢" randomize b=int(rnd*10) select case b case 0,1,2 c=messagebox("吉でした。彼女はいますか?",4) if c=6 then msgbox"90%",,b elseif c=7 then msgbox"60%",,b end if case 3,4,5 d=msgbox("凶でした。友達はいますか?",4) if d=6 then msgbox"60%",,b elseif d=7 then msgbox"20%",,b end if case 6,7 e=msgbox("末吉でした。",4) if e=6 then msgbox"60%",,b elseif e=7 then msgbox"40%",,b end if case 8 f=msgbox("大凶でした。夢はありますか?",4) if f=6 then msgbox"30%",,b elseif f=7 then msgbox"10%",,b end if case else msgbox"100%",,b end if elseif a=7 msgbox"0%" end select

  • WSHでプログラムをやっている者です。(遊びですが)

    WSHでプログラムをやっている者です。(遊びですが) そこで質問ですが、いま乱数と分岐を組み合わせてつくっています。 その際、まれにプログラムが飛んでしまいます。下に載せるので、ミスがあれば教えていただきたいです。よろしくお願いします。 dim xa,za,a xa=msgbox("ゲーム挑戦権の獲得を試みますか?",4) if xa=6 then randomize za=int(rnd*10) select case za case 0,1,2,3,4 za=msgbox("ゲームへの挑戦権を獲得しました。挑戦しますか?",4) case else msgbox"ゲームへの挑戦権獲得に失敗しました。またチャレンジしてください。"⇒(1) end select elseif xa=7 then msgbox"さようなら" end if if za=6 then a=msgbox("ではゲームを始めます。用意はよろしいですか?",4)⇒(2) elseif za=7 then msgbox"また次の機会に挑戦してください。"⇒(3) end if メッセージボックスに(1)が表示されたら、それでプログラムが終わるようにしたつもりですが、 数回に一回、(1)で「OK」をクリックすると(2)や(3)に飛びます。何らかのミスでしょうか?

  • VBScriptである文字列に半角文字が含まれているかどうか調べる方法について

    VBScriptである文字列に半角文字が含まれているかどうか調べる方法について、ネットで調べてソースコードを拾ってきたのですが... IFの条件でなぜ全角、半角が判断できるか分かりません。教えてください。お願いします。 iLen = Len(str1) iLenByte = 0 '--- 文字列のバイト数 For i = 2 To iLen strField = Mid(str1, i, 1) iCode = Asc(strField) If iCode > 0 Then '--- 半角文字 Else '--- 全角文字 End If Next

  • 【VBScript】プログラム改良

    VBScriptのプログラムについて、 回答頂きたく投稿しました。 以下を実行すると、 65行目で「'End'がありません。」とエラー表示されてしまいます。 End Ifは入れているはずですが、どこが問題なのでしょうか? またIfステートメントを少し減らしたいのですが、 どうすればシンプルな形になりますでしょうか? 恐れ入りますが、アドバイス頂ければ幸いです。 Option Explicit Dim intCount, strFile, strArg, strX, lonMsgBox, objFSO, objOpen, strText, strNewFile, objTS intCount = 0 If WScript.Arguments.Count = 0 Then WScript.Echo "引数が指定されていません。" WScript.Quit End If For Each strArg In WScript.Arguments intCount = intCount + 1 strFile = strArg Next Set objFSO = CreateObject("Scripting.FileSystemObject") If objFSO.GetExtensionName(strFile) <> "txt" Then If intCount > 1 Then MsgBox "2つ以上のファイルが指定されています。" & vbCr _ & "ファイルを指定し直してください。", 48, "Error" WScript.Quit Else MsgBox "テキストファイル以外が指定されています。" & vbCr _ & "ファイルを指定し直してください。", 48, "Error" WScript.Quit End If Else strX = InputBox("抽出したい文字列を入力してください。", "変換処理") If strX <> "" Then lonmsgbox = MsgBox (strX & "を抽出します。" & vbCr _ & "変換しますか?", 4 + 32 + 0, "確認") If lonmsgbox = 6 Then strNewFile = objFSO.BuildPath( _ objFSO.GetParentFolderName(strFile), _ objFSO.GetBaseName(strFile) & "_New." & objFSO.GetExtensionName(strFile)) Set objTS = objFSO.OpenTextFile(strNewFile, 2, True) Set objOpen = objFSO.OpenTextFile(strFile, 1) Do Until objOpen.AtEndOfStream = True strText = objOpen.ReadLine If InStr(strText, strX) > 0 Then objTS.WriteLine strText End If Loop objTS.Close Set objTS = Nothing objOpen.Close Set objFSO = Nothing WScript.Sleep 1000 MsgBox ("文字列の抽出が完了しました。") Else MsgBox ("処理を中断します。") End If End If ElseIf IsEmpty(strX) then MsgBox ("キャンセルされました。") WScript.Quit Else MsgBox "文字列が入力されていません。" & vbCr _ & "入力し直してください。", 0, "Error" WScript.Quit End If

  • access フォームについて

    access2003にて登録フォームを作成しています。 このフォーム内に入力したデータを登録ボタンを押し、「登録しますか」のメッセージに 「いいえ」とすれば保存せずにこのフォームを閉じる。 「キャンセル」とすれば保存せずにフォームに戻る。 「はい」とすれば保存して閉じたいです。 しかし、以下の式を実行すると 「いいえ」はバッチリ希望通りに動くのですが、 「キャンセル」をすると保存されてフォームに戻り、 「はい」とすると保存されずにフォームが閉じられてしまいます。 何がまずいのでしょうか・・・。 ----- Private Sub Form_BeforeUpdate(Cancel As Integer) Dim Ret As Integer Ret = MsgBox("登録しますか?" & vbCrLf & " " & vbCrLf & "「いいえ」を選択すると保存せず閉じます", vbYesNoCancel) '「いいえ」を選択したら、保存せずに閉じる If Ret = vbNo Then DoCmd.Close acForm, "振返りデータ", acSaveNo '「キャンセル」を選択したら、保存せずにフォームに戻る Else If Ret = vbCancel Then Else DoCmd.Close acForm, "振返りデータ", acSaveYes End If End If End Sub