Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2475 / 13646 ツリー ←次へ | 前へ→

【67807】if 文に使用しているLikeについて aoba 11/1/11(火) 12:55 質問[未読]
【67808】Re:if 文に使用しているLikeについて kanabun 11/1/11(火) 13:09 発言[未読]
【67810】Re:if 文に使用しているLikeについて aoba 11/1/11(火) 14:13 お礼[未読]
【67817】Re:if 文に使用しているLikeについて neptune 11/1/11(火) 17:27 発言[未読]
【67826】Re:if 文に使用しているLikeについて aoba 11/1/12(水) 8:59 質問[未読]
【67827】Re:if 文に使用しているLikeについて UO3 11/1/12(水) 9:31 発言[未読]
【67829】Re:if 文に使用しているLikeについて aoba 11/1/12(水) 10:05 お礼[未読]
【67830】Re:if 文に使用しているLikeについて neptune 11/1/12(水) 10:30 回答[未読]
【67831】Re:if 文に使用しているLikeについて kanabun 11/1/12(水) 11:46 発言[未読]
【67832】Re:if 文に使用しているLikeについて kanabun 11/1/12(水) 11:49 発言[未読]
【67833】Re:if 文に使用しているLikeについて kanabun 11/1/12(水) 12:08 発言[未読]

【67807】if 文に使用しているLikeについて
質問  aoba  - 11/1/11(火) 12:55 -

引用なし
パスワード
   文字列操作でサンプルを見ていました
以下のように書かれていまして
If 文中にLikeがありましたが
意味がよく分かりません
よろしくお願いいたします

Sub 文字列()
Dim 文字列 As String

  文字列 = "123"
  If 文字列 Like "###" = True Then
    MsgBox "3桁の数字です。"
  End If
End Sub

【67808】Re:if 文に使用しているLikeについて
発言  kanabun  - 11/1/11(火) 13:09 -

引用なし
パスワード
   ▼aoba さん:こんにちは〜

>If 文中にLikeがありましたが
>意味がよく分かりません

どこが分かりませんか?

たとえば、パターン文字「?」は1つの文字を表します。

If 文字列 Like "???" Then
    MsgBox "3文字です。"
End If

で、パターン文字「#」はひとつの数字[0-9]を表します。
なので、「###」は数字が3つ というパターンのことです。

>  If 文字列 Like "###" Then
    MsgBox "3桁の数字です。"
>  End If

以下と同じ意味になります。

  If 文字列 Like "[0-9][0-9][0-9]" Then
    MsgBox "3桁の数字です。"
  End If

詳細は、
ヘルプで「Like演算子」を読んでください。

【67810】Re:if 文に使用しているLikeについて
お礼  aoba  - 11/1/11(火) 14:13 -

引用なし
パスワード
   ▼kanabun さん:
Like演算子はワイルドカード(*、?、等)を使用したときに
比較するのですね
有難うございました


>>If 文中にLikeがありましたが
>>意味がよく分かりません
>
>どこが分かりませんか?
>
>たとえば、パターン文字「?」は1つの文字を表します。
>
>If 文字列 Like "???" Then
>    MsgBox "3文字です。"
>End If
>
>で、パターン文字「#」はひとつの数字[0-9]を表します。
>なので、「###」は数字が3つ というパターンのことです。
>
>>  If 文字列 Like "###" Then
>    MsgBox "3桁の数字です。"
>>  End If
>
>以下と同じ意味になります。
>
>  If 文字列 Like "[0-9][0-9][0-9]" Then
>    MsgBox "3桁の数字です。"
>  End If
>
>詳細は、
>ヘルプで「Like演算子」を読んでください。

【67817】Re:if 文に使用しているLikeについて
発言  neptune  - 11/1/11(火) 17:27 -

引用なし
パスワード
   ▼aoba さん:
kanabun さんではありませんが、
>Like演算子はワイルドカード(*、?、等)を使用したときに
>比較するのですね
根本的に理解が違いますよ。
2つの文字列の比較を行う為の演算子です。

その比較する機能の1つとして、ワイルドカードが使用可能なだけです。

【67826】Re:if 文に使用しているLikeについて
質問  aoba  - 11/1/12(水) 8:59 -

引用なし
パスワード
   ▼neptune さん:
ご指摘有難うございました
以下の記述でためしましたが数値の比較もOkのようですが
 mj1 Like mj4  は mj1=mj4 と同じ意味をもつのでしょうか
もし、同じであれば 使い分けはどのようにしているのでしょうか
よろしくお願いいたします
Sub 比較()
Dim mj1 As Integer
Dim mj2 As String
Dim mj3 As String
Dim mj4 As Integer

  mj1 = 123
  mj2 = "平成"
  mj4 = 123
  If mj1 Like mj4 Then
    MsgBox "文字列は同じです"
  Else
    mj3 = "明治"
  End If

End Sub

【67827】Re:if 文に使用しているLikeについて
発言  UO3  - 11/1/12(水) 9:31 -

引用なし
パスワード
   ▼aoba さん:

おはようございます

横入り失礼します。

同じかどうかは、試してみればわかると思うのですが。

Sub 比較の比較()
Dim mj1 As Integer
Dim mj4 As Integer

  mj1 = 123
  mj4 = 123
  
  MsgBox mj1 Like mj4
  MsgBox mj1 = mj4
 
End Sub

>もし、同じであれば 使い分けはどのようにしているのでしょうか

結果は同じですが、 Like の右辺と、 = の 右辺は意味が異なります。
ヘルプによればLike の右辺は「パターン文字」で
【必ず指定します。「解説」に示すパターン マッチング規則に従った任意の文字列式を指定します。】

通常は左辺の文字列を比較するためのパターンを指定するわけですが、たまたま、このパターンが全て
【定数】なら結果として = で判定しているのと同じになるということです。

使い分け? う〜ん、このように全てを定数で指定するなら Like を使う必要はないと思いますが
好みの問題でしょうか?

【67829】Re:if 文に使用しているLikeについて
お礼  aoba  - 11/1/12(水) 10:05 -

引用なし
パスワード
   ▼UO3 さん:
ご丁寧なアドバイス有難うございました
 **Like の右辺と、 = の 右辺は意味が異なります**
見た目は同じなので 意味が異なるとは思ってもみませんでした
もっと理解をして作成しなければと あらためて反省です
有難うございました

【67830】Re:if 文に使用しているLikeについて
回答  neptune  - 11/1/12(水) 10:30 -

引用なし
パスワード
   ▼aoba さん:
既にUO3さんが解説してくださっていますので、私はHelpに基づいて
ちょっとだけ。

先ず、機能としては、以下
2 つの文字列の比較を行います。

書式は
/////////////以下Helpより/////////////
構文

result = string Like pattern

指定項目 内容
result 必ず指定します。任意の数値変数を指定します。
string 必ず指定します。任意の文字列式を指定します。
pattern 必ず指定します。「解説」に示すパターン マッチング規則に従った任意の文字列式を指定します。
/////////////////////////////////////
です。

従って
>  If mj1 Like mj4 Then
は既に、構文を無視している事は明らかですね。

では何故エラーにならないか?
それはVBが変に親切で勝手に型変換をしているからです。
慣れてくると小さな親切大きなお世話ってな感じになります。

なので、VBの暗黙の型変換を使用しない利用方法を取ることを心掛けると
>もし、同じであれば 使い分けはどのようにしているのでしょうか
という心配は不要になります。

なので本来は
If mj1 = mj4 Then
又は
If cstr(mj1) Like cstr(mj4) Then  'こっちは本来すべきじゃないですが例として。
とすべきなんです。

なので、私はhelpの書式通りに書く事を心掛けています。

「暗黙の型変換」で検索すると判りやすい解説を井上さんが公開してくれていました。
ht tp://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_050_08.html

まぁ取り敢えずわからなくてもHelpを精読する事は必須と思って下さい。
Helpの判らない所は今回のようにこういう場所で質問できますから。

少なくともその手の質問は、如何にも初心者をひけらかしてソース書いて
欲しい風の内容の質問(とは言えませんし、私はres付けませんけど)よりは
多くの親切なアドバイスが頂ける事は間違いないです。

【67831】Re:if 文に使用しているLikeについて
発言  kanabun  - 11/1/12(水) 11:46 -

引用なし
パスワード
   ▼aoba さん:

腹一杯かも知れませんが(^^

If a = b Then の 「=」や、
If s Like p Then の「Like」は 分類上
比較演算子と呼ばれるものです。

たとえば、
If a = b Then は aが b「と等しいか」比較しています。
 aとbが等しければ 式 (a = b) は Trueを返します。

If a > b Then は a が b「より大きいか」を比較しています。
 aがbより大きければ 式 (a > b) は Trueを返します。

If CDate("2011/01/01") < Date は今日が2011/1/1より大きいか
(2011年1月1日が過去の日付か?)を調べています。

 Dim c As Range
 Set c = Range("A1:A1000").Find("あいう")
 If c Is Nothing Then
  MsgBox c.Address
 End If

> If c Is Nothing Then
「Is演算子」はRangeオブジェクトc が 「Nothingであるか」を
比較しています。
(cがNothingだったら、Find検索で見つかったセルがなかった
 ことが分かります)

これらと同じように、
> If s Like p Then
は 文字列s が pというパターンと合致しているかを比較しています。

簡単にいえば
「=」演算子は 演算子の両側の値「が等しいか」を調べているのに対し、
「Like」演算子は両側の文字列「が似ているか」を調べています。

Dim s As String
s = "ABC20110101.xls"
If s Like "ABC*" Then 
  これは 文字列(実はファイル名)が「ABCで始まっているか」を
  調べています(s と "ABC*"というパターンとを比較しています)

If Lcase$(s) Like "*.xls" Then 
  これは ファイル名(拡張子)が「xlsであるか」をLike演算子で
  調べています(s と "*.xls"というパターンとを比較しています)

If s Like "???2011*" Then
  これはファイル名の4文字目以降に"2011"という文字列が含まれ
  ているかを調べています。

If s Like "???####*" Then
  これはファイル名の4文字目以降に任意の数字が含まれているか
  を調べています。(文字列sとパターン"???####*"を比較しています)

If s Like "*########*" Then
  これはファイル名のなかに「8桁の数字がが含まれているか」
  を調べています。(文字列sとパターン"???####*"を比較しています)

【67832】Re:if 文に使用しているLikeについて
発言  kanabun  - 11/1/12(水) 11:49 -

引用なし
パスワード
   ↑すみません。最後の文章、まちがいです

>If s Like "*########*" Then
>  これはファイル名のなかに「8桁の数字がが含まれているか」
  を調べています。(文字列sとパターン"*########*"を比較しています)

【67833】Re:if 文に使用しているLikeについて
発言  kanabun  - 11/1/12(水) 12:08 -

引用なし
パスワード
   Like演算子は SQLでも使われます

結構解説が分かりやすいので、リンクのせときますね
ht tp://office.microsoft.com/ja-jp/access-help/HP001032253.aspx

2475 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free