【無料配信♪】Renta !全タテコミ作品第1話

したいのですが、どうやらエラーになるようです。

Sub test()
Dim mystr As String

mystr = "[test]"
If mystr Like "*[*" Then
MsgBox "[が含まれます"
End If

End Sub


だと、実行時エラー93 パターン文字列が不正ですになります。

こういうように各カッコが含まれてるかどうかを取得するにはどうすればいいですか?

このQ&Aに関連する最新のQ&A

A 回答 (5件)

#1、2、cjです。



パターンマッチングのお話だと思い、お応えしているのですが、、、。

ちょっと片手落ちだった気もするので、一応補足を加えます。
  If mystr Like "*[[]*]*" Then
のように書けば、[と]の組み合わせを同時にマッチングできます。

各種の正規表現やExcel一般機能(関数等)には
メタ文字(Like演算子の角括弧のように意味を持つ特殊文字)を
文字列比較する為にエスケープ文字(^や\や~を特殊文字の前に付加)が用意されていますが、
Like演算子の場合はエスケープ文字がありません。
(これ↑、はっきり書いた方が良かったですね)
#2で引用したVBAヘルプのメモのように、
エスケープする為に角括弧[]で括る必要があります。
正規表現などに比べればマッチングが制限されているのも確かです。
特長を示す例としては
  If mystr Like "*[[]t*]*" Then
のように判別することで、
mystr = "[test]" なら マッチするのでTrue
mystr = "[rest]" や
mystr = "[test" や
mystr = "test]" 等なら マッチしないのでFalse
というような使い方をします。
ただLike演算子のパターンマッチングは万能ではありませんから、
場合によっては正規表現(VBAの場合はVBScriptのRegExp)を用いて
より精度の高いパターンマッチングが求められるケースもあることでしょう。

"角カッコが含まれてるかどうか"
だけ、を限定的な意味で捉えれば、それは検索ですから、
InStr関数を使って、戻り値が[0でない場合、0である場合]
といった具合に判別するのは、非常に優れた検索方法です。

目的に適うツールを選べるように、
基本的なことは色々知っておいた方がいい、ということになるのでしょうか。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2013/10/17 21:18

こんにちは!



どうしてもlike演算子でないとダメですか?
Like演算子に関してはすでにNo.1さんが回答ずみですので、
質問にあるような問題が出てくると思います。

別案として
>If Len(mystr) > Len(Replace(mystr, "[", "")) Then
のようにLike演算子を使用しない方法ではどうでしょうか?m(_ _)m
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2013/10/17 21:18

こんにちは、likeでは回答が出ておりますので


>こういうように各カッコが含まれてるかどうかを取得するにはどうすればいいですか?
InStr 関数を使った方法です。参考に

mystr = "[test]"
If InStr(mystr, "[") Then
  MsgBox "[が含まれます"
End If
    • good
    • 1
この回答へのお礼

ありがとうございました。

お礼日時:2013/10/17 21:18

#1、cjです。

追加レスです。

VBAヘルプの Like演算子を引くと、正にご質問への答えが説明されていました。
以下VBAヘルプより引用(改行は筆者)
|メモ 特殊文字の左角かっこ ([)、疑問符 (?)、数値記号 (#)、およびアスタリスク (*) を
|文字列比較するには、これらの文字を角かっこで囲みます。
|右角かっこ (]) をワイルドカードとしてではなくその文字自体として文字列比較を行うときには、
|右角かっこを他の文字と共に角かっこで囲んでリストの中に指定することはできません。
|右角かっこは、文字のリストに入れずに単独で指定すると、
|独立した文字として、文字列の中の文字と比較できます。
以上引用
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2013/10/17 21:18

こんにちは。


こんな感じで。

Sub test()
  Dim mystr As String

  mystr = "[test]"
  If mystr Like "*[[]*" Then
    MsgBox "[が含まれます"
  End If

End Sub
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2013/10/17 21:18

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QEXCEL VBAで全選択範囲の解除

EXCEL VBAで
Cells.Select
と書くと、全セルが選択状態になりますが、
これを解除するには、どう書けばよいのでしょうか?

Aベストアンサー

その1
A1 など、適当なセルを選択する。
(回答#1と同じ)

その2
全選択する前の選択範囲に戻る。

全選択前に
変数 = Selection.Address で記憶

全選択後
Range(変数).Select で元の選択範囲を選択

QEXCEL VBAマクロ作成で、他のEXCELからデータを取り込みたい

メインプログラム(EXCEL VBA)より、
他のフォルダーにあるEXCELの項目の内容を取り込みたいです。
たとえば他のフォルダーのEXCELのRange("A2:A3").ValueをメインプログラムのRange("C2:C3").Valueにセットしたい時です。

・コマンドボタン押したら、どこのEXCELから取り込むかのポップアップ(?)は、表示はできてます。
・作業者が選んだパスとブックもMsgBoxで表示できてるので、もらう相手の場所も取得できてます。

・となると次はOPEN,INPUTですか?
テキストデータの取り込みですと、Inputでそのバッファを定義してるのですが、なんか違うような。。。

よろしくお願いします!

Aベストアンサー

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Cells(2, 2).Value ' 相手シートの B2 の値を自分自身の A1 に書き込む

readBook.Close False ' 相手ブックを閉じる
Set readSheet = Nothing
Set readBook = Nothing

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Ce...続きを読む

QVBAで英数字入力チェックしたい。

いつもお世話になります。

いままで、ある項目の入力チェックを数字のみで
行っていたところ【IsNumeric】を英数字で行いたいのですが
いくら調べても見当たりません・・・

知っている方、どうかご指南ください。
よろしくお願いします。

Aベストアンサー

IsAlphaが無いですね。
チェック用に、半角に統一して(StrConv)文字列を作り、
1字づつ、JISコードの65-90、97-122をエラーにするチェックを行い、上記作った文字列はチェック後は使い捨てる。
こういうルーチンを作るより他ないでしょう。
記号なども含めて考える。
ただ記号は十分検討が必要です。制限しすぎると、運用後にダウンとか、大騒ぎになる恐れをこめてます。

Q文字列の括弧について(初心者)

textに自分で入力した値を変数文字列として扱う場合に、括弧を使いたいのですが、


Dim A as string
Dim B as string
A = Text1.text
B = "abc"

としてコマンドボタンを押したときにAとBの値が同じ場合(Aがabc)は1をAとBの値が違うときは0を出力するプログラムを作ったのですが、これに追加で括弧()や[]をつけても1を出力するプログラムが作りたいのですが、よくわかりません。

Text1.textの値が(abc)か[abc]でも1を出力、 [ab]cやa(b)cでも1を出力、(abcやa)bc(やa(b(cのときは0を出力するプログラムが作りたいのです。

どうか教えてください。
おねがいします。

Aベストアンサー

'()または、[]がペアになっているか調べてなっていれば取り除いて=かどうか調べる
Dim bucketL, bucketR,a,b
a=Text1.text
b="abc"
bucketL = InStr(a, "[")
bucketR = InStr(a, "]")
If bucketL < bucketR And bucketL * bucketR <> 0 Then
a = Replace(a, "[", "", , 1)
a = Replace(a, "]", "", , 1)
End If
bucketL = InStr(a, "(")
bucketR = InStr(a, ")")
If bucketL < bucketR And bucketL * bucketR <> 0 Then
a = Replace(a, "(", "", , 1)
a = Replace(a, ")", "", , 1)
End If
if a = b then
'同じ
MsgBox 1
else
'違う
MsgBox 0
end if

'()または、[]がペアになっているか調べてなっていれば取り除いて=かどうか調べる
Dim bucketL, bucketR,a,b
a=Text1.text
b="abc"
bucketL = InStr(a, "[")
bucketR = InStr(a, "]")
If bucketL < bucketR And bucketL * bucketR <> 0 Then
a = Replace(a, "[", "", , 1)
a = Replace(a, "]", "", , 1)
End If
bucketL = InStr(a, "(")
bucketR = InStr(a, ")")
If bucketL < bucketR And bucketL * bucketR <> 0 Then
a = Replace(a, "(", "", , 1)
a = Replace(a, ")", "", , 1...続きを読む

Q"["と"]"のパターンマッチング(VBA)

AccessのVBAについて質問です。

入力された文字列が角カッコ"[]"を
含んでいるかどうかを知りたいです。
しかしLike演算子を使うと、パターン文字列を
どうすればいいのか分かりません。
具体的には"aaa[12]"のようなインデックスが
ついているかどうかを判断したいだけなので
力技でできないこともないんですが。

分かる方よろしくお願いします。

Aベストアンサー

こんばんは。
>具体的には"aaa[12]"のようなインデックスがついているかどうかを判断したい
myStr = "aaa[12]"
If myStr Like "*[[][0-9]*[]]" Then
  Beep
End If


Like演算子で記号を検索する場合は、[] ではさみます。

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

QLike演算子で、[と]を文字として扱い比較したい

今、フォルダ内のファイルリストを作成するVBA(Excel2003)を作っています。そこで、ファイル(絶対パス:フルパス)に「含まれていい文字」と「含まれない文字」(キーワード)を指定できる機能を作っています。

以前、VB6で類似の機能を作った時は、すんなり行ったのですが、VBAではうまくいきません。正規表現が使えるに越したことはないのですが、「 [ や ] を文字として認識するだけでもいいです。」

リストを作るフォルダには、
 [20].txt
 テキスト[a]txt
 メモ[10] - コピー.txt
などのテストファイルとその他ファイルが存在します。


キーワードを指定しないときには、うまく行きます。
指定すると、たとえば [10].txt というファイルがヒットしないように、NGワードを [10] を指定すると、[20].txtまでヒットしません。[a]では全てがヒットしません。

また、OKワードに[10]を指定すると[10]と[20]がヒットします。
===== NGワードを比較している部分 ====
引数:in_str が NGワード(スペースで区切って複数指定可能)
引数:target_Str がフルパス

Public Function keywords_NG(in_Str As String, target_Str As String) As Boolean
  If in_Str = "" Then
    keywords_NG = True
    Exit Function
  End If
  
  Dim wordArray() As String
  Erase wordArray()
  wordArray() = Split(in_Str, Space(1))
 
  Dim tempFLG As Boolean
  tempFLG = True
  
  Dim wordIDX As Long
  For wordIDX = 0 To UBound(wordArray) Step 1
    If wordArray(wordIDX) <> "" And target_Str <> "" Then
      If target_Str Like "*" & wordArray(wordIDX) & "*" = True Then
        tempFLG = False
      End If
    End If
  Next
  If tempFLG = True Then
    keywords_NG = True
  Else
    keywords_NG = False
  End If
End Function

===== OKワードを比較している部分 ====

引数:in_Str が OKワード(スペースで区切って複数指定可能)
引数:target_Str がフルパス

Public Function keywords_OK(in_Str As String, target_Str As String) As Boolean
  If in_Str = "" Then
    keywords_OK = True
    Exit Function
  End If

  Dim wordArray() As String
  Erase wordArray()
  wordArray() = Split(in_Str, Space(1))
  
  Dim tempFLG As Boolean
  tempFLG = False
  
  Dim wordIDX As Long
  For wordIDX = 0 To UBound(wordArray) Step 1
    If wordArray(wordIDX) <> "" And target_Str <> "" Then
      If target_Str Like "*" & wordArray(wordIDX) & "*" = True Then
        tempFLG = True
      End If
    End If
  Next
  
  If tempFLG = True Then
    keywords_OK = True
  Else
    keywords_OK = False
  End If
  
End Function
===== [や]を区切り文字ではなくする関数 ====
Public Function keywords_escape_sequence(keywordStr As String) As String
  
  If keywordStr = "" Then
    keywords_escape_sequence = ""
    Exit Function
  End If
  
  Dim myIDX As Currency
  Dim str_X As String
  
  str_X = ""
    
  For myIDX = 1 To Len(keywordStr) Step 1
    If Mid(keywordStr, myIDX, 1) = "[" Then
      str_X = str_X & "[[]"
    ElseIf Mid(keywordStr, myIDX, 1) = "]" Then
      str_X = str_X & "[]]"
    Else
      str_X = str_X & Mid(keywordStr, myIDX, 1)
    End If
  Next
  
  keywords_escape_sequence = str_X
End Function

=====================================================
    If keywords_OK(keywords_OK_Str, フルパス)) = True And _
      keywords_NG(keywords_NG_Str, フルパス)) = True Then
        'ファイルリスト作成
    end if
=====================================================

正規表現を使うためには…というページを見つけ参照設定に以下の項目にチェックを入れてみましたが、結果は変わらす

□Microsoft VBScript Regular Expressions 5.5

===== RegExp と CreateObject ====

参照設定をできれば変更したくない場合は、RegExp と CreateObject を使えば良いとあるページに書いてありましたが、参照設定でもできなかったので、これだけは試してません。

ヒントだけでもお教えください。

今、フォルダ内のファイルリストを作成するVBA(Excel2003)を作っています。そこで、ファイル(絶対パス:フルパス)に「含まれていい文字」と「含まれない文字」(キーワード)を指定できる機能を作っています。

以前、VB6で類似の機能を作った時は、すんなり行ったのですが、VBAではうまくいきません。正規表現が使えるに越したことはないのですが、「 [ や ] を文字として認識するだけでもいいです。」

リストを作るフォルダには、
 [20].txt
 テキスト[a]txt
 メモ[10] - コピー.txt
などのテスト...続きを読む

Aベストアンサー

Sub try()
Dim RegExp As Object
Dim v(1 To 3) As String
Dim KeyWord As String
Dim i As Integer

Set RegExp = CreateObject("VBScript.RegExp")

v(1) = "[20].txt"
v(2) = "テキスト[a]txt"
v(3) = "メモ [10] - コピー.txt"

KeyWord = "10" 'キーワードは[]の中の数字のみ

RegExp.Pattern = "\[" & KeyWord & "\]"

For i = 1 To 3
If RegExp.Test(v(i)) Then 'キーワードに一致でOK
MsgBox v(i)
End If
Next

MsgBox "チェンジ"

For i = 1 To 3
If Not RegExp.Test(v(i)) Then 'キーワードに不一致でOK
MsgBox v(i)
End If
Next

Set RegExp = Nothing
Erase v

End Sub

勘違いでしたらスル~して下さい。

Sub try()
Dim RegExp As Object
Dim v(1 To 3) As String
Dim KeyWord As String
Dim i As Integer

Set RegExp = CreateObject("VBScript.RegExp")

v(1) = "[20].txt"
v(2) = "テキスト[a]txt"
v(3) = "メモ [10] - コピー.txt"

KeyWord = "10" 'キーワードは[]の中の数字のみ

RegExp.Pattern = "\[" & KeyWord & "\]"

For i = 1 To 3
If RegExp.Test(v(i)) Then 'キーワードに一致でOK
MsgBox v(i)
End If
Next

MsgBox "チェンジ"

For i = 1 To 3
If Not RegExp.Test(v(i)) T...続きを読む

QExcel MATCH関数で検索範囲内に同じ値の検索値が複数ある場合

MATCH関数で、検索した値が複数ある場合に1つしか出なくて困っています。
(例)
   A B C D
1 年月日 種類 番号 備考
2 4月1日 肉類 1
3 4月2日 野菜 2
4 4月3日 肉類 1
5 4月4日 果物 2
6 4月5日 野菜 1
7 4月6日 果物 3
8 4月7日 果物 2
9 4月8日 肉類 1

この表で、D9の備考の欄に「種類:肉類、番号:1」と同じものがあった時の日付を、新しい日付で取り出したいのです。

INDEX(A2:A8,(MATCH(B9,B2:B8,0)+MATCH(C9,C2:C8,0))/2)
としたのですが、本当は4月3日を取り出したいのですが、4月1日が出てきます。
どのようにしたら良いでしょうか?
Excel2003です。
よろしくお願いします。

Aベストアンサー

MATCH関数を使用しませんが、D9の書式を日付にして、
=MAX((A2:A8)*(C2:C8=1)*(B2:B8="肉類"))
と、入力してShift+Ctrl+Enterキーで入力完了してみてください(配列式になります)。

QEXCEL VBA Like演算子 パターンマッチング について

平素お世話になっております。
Like演算子のパターンマッチングを利用して以下の5個の記号を判断したいと考えております。
()[]-
以下のように記述を行っても
Like "[()[]-]"
当然のごとく[]-の3個の記号が判断されません。
エスケープシーケンスが必要だと思いますが、記述方法がわかりません。
ご存知の方がおられましたら、ご教授のほどよろしくお願いいたします。

Aベストアンサー

2つに分けないといけないかと

if ss like "[[()-]" or ss like "[]]" then
]だけで指定する部分とほかの部分とに分けると出来るようです

QVBAでの[]

Excel VBAのプログラム上で

SNDsrcNoC = [N_SrtNO].Column

のように、[]で囲まれている箇所があるのですが、どんな意味なのかわからないでおります。

[]の前に何もないので、配列の添え字や関数の引数でもなさそうです。
ご存知の方どうか教えてください。

VBA []

とかでグーグル検索してもうまいのがでてきません。

Aベストアンサー

「N_SrtNO」はCtrl+F3「名前の定義」を使ってセル範囲に付けられた名前でしょう。

『Evaluateメソッド』のヘルプを参照してください。
http://msdn.microsoft.com/ja-jp/library/aa191489.aspx
>メモ Evaluate メソッドの代わりに角かっこを使っても、同じ結果が得られます ([A1:C5] など)。

参照するオブジェクト---今回の事例では名前「N_SrtNO」のセル範囲---を文字列で指定できます。
[N_SrtNO].Column は Evaluate("N_SrtNO").Column
つまり
Range("N_SrtNO").Column です。

関連QA:
http://oshiete.goo.ne.jp/qa/6681089.html?order=asc


人気Q&Aランキング