こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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関数にはこだわりませんが、スラッシュやアスタリスクなどを、半角だけ
認識させるには、どのようにしたら良いでしょうか。
出来ましたら、具体例をご教授願います。

投稿日時 - 2015-01-28 22:43:13

QNo.8906644

困ってます

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

> ダブルクォーテーションのみ、Instr関数に入れられなくて
> 弾けなかったので、課題として残ってしまいました。

コードのリテラル文字列内("で囲まれている部分)では、ダブルクォーテーションは、"" と重ねます。


If InStr(1, Me.strFullPath, """",vbBinaryCompare) > 0 Then

投稿日時 - 2015-01-29 19:44:16

補足

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

投稿日時 - 2015-01-30 14:08:05

お礼

回答ありがとうございました。
最終的に、記号を判別する部分のみ、別のモジュールで
判別させることで、対応できました。

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

投稿日時 - 2015-01-30 14:31:39

このQ&Aは役に立ちましたか?

11人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.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

のままでよい。
ただし、モジュール内の比較が、すべてバイナリーモードでの比較になるので注意が必要。

投稿日時 - 2015-01-28 23:12:28

お礼

回答ありがとうございます。
InStr関数で、/ : * ? <> |を弾くのは出来ました。

知識不足では有りますが、文字コードを判別して
数値計算を行っている部分があるので、モジュール内を
全てバイナリモードにするのは、不具合が出そうです。

ダブルクォーテーションのみ、Instr関数に入れられなくて
弾けなかったので、課題として残ってしまいました。

投稿日時 - 2015-01-29 01:56:44

あなたにオススメの質問