重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

こんにちは。

関数というより使い方がわかりません。
どなたかおしえてください。

セル(3、2)に文字列 Excelマクロ(VBA)練習 が元データとしてあり
VBAだけを抜き出し セル(3,3)に結果を出力する場合以下のような式になるようなので
すが、

①Cells(3, 3) = Mid(Cells(3, 2), 10, 3)または (10文字目から3文字をとる)
②Cells(3, 3)
= Mid(Cells(3, 2), InStr(Cells(3, 2), "(") + 1, InStr(Cells(3, 2), ")") - InStr(Cells(3, 2), "(") - 1) 
これは、どうしたら上記のように10文字目から3文字をとるということになるのでしょうか?


①は理解できるのですが、②でも同じようにVBAを取り出せるのかがわかりません。
この引き算はどこからなにをひいているのでしょうか?

InStr(Cells(3, 2), "(") + 1  10文字目
InStr(Cells(3, 2), ")")  13 文字目
InStr(Cells(3, 2), "(") - 1  8 文字目

以上 よろしくお願いいたします。

質問者からの補足コメント

  • ありがとうございます。
    おしえてください。

    >InStr(Cells(3, 2), "(") + 1
    で ( が頭から何文字目にあるか検索し、その次の文字から取得 
    >10文字目

    >InStr(Cells(3, 2), ")")
    で ) が何文字目にあるかを検索し、
    >13文字目

    >- InStr(Cells(3, 2), "(") - 1
    で表示する文字列の長さ(文字数)を示しています。8文字?
    文字列の長さ(文字数)は5になるのでしょうか?
    これは、13文字-8文字でしょうか? 13から8をひき文字数をもとめえいる?

    No.1の回答に寄せられた補足コメントです。 補足日時:2018/07/18 20:45

A 回答 (4件)

#3の回答者です



最近、アクセス数が減っておりますので、すぐに対応できなくてすみません。
>正直ちょっとわかりませんが、

私のは、質問の回答にはなっていなかったのでしょうか?

気が付きませんでしたが、私は、今年1月から、ご質問者さんには、数回、回答をさせていただいています。いままでのご質問者さんとの過去ログと今回の質問を比較して、同じ人とは思えないほど、その質問内容のレベル格差に大変に驚いています。

大変失礼ですが、もし、別の意図がなければ、ご質問になっている内容そのものは、初歩の初歩です。VBA入門1ヶ月後ぐらいに習うことです。私が、「Mid関数か正規表現か」と触れたのは、以前にも回答したことがある、Web スクレーピングの際に、2つの選択を迫られるのが、このことです。

Mid, Left, Right などの文字列関数の中で、VBAでは、最もよく使われるのが、Mid関数です。
私の#3の回答の趣旨は、コーディングのデバッグを前提としたものとして解釈すると、わかるはずです。途中にブレークポイントを置けば、ローカルウィンドウで、その変数の動きが確認できますから、デバッグが確実なものになるということでした。ネストを多様するのは、VBA/VBの場合は、潜在的なエラーが見出しにくくなるので、避けたほうがよいです。

また、Excel Version が、2013以上をお使いなのでしょうか?
今回の件は、ヘルプをみれば簡単にわかることだと思います。

2013以上は、オンラインでしかありませんから、小回りが利きません。オフライン日本語ヘルプが存在するのは、Ver.2010までです。

ヘルプも、オフラインで持つとよろしいのですが、他の下位バージョンからヘルプだけを抜き出して使う方法も考えたほうがよいと思います。他の方たちはどうされているのか知りませんが、私は、Ver.5(=Excel 5/95)からのヘルプをDocumentsフォルダーに入れています。2010-2007辺りのOffice のヘルプを単独で閲覧する時には、CLVIEW.EXEが必要になります。

添付画像は、オフライン・ヘルプです。私は、この翻訳事情は多少は何度か見たり聞いたりしています。これは、元の英語を入念に間違いのないように、複数の人によって翻訳されたものです。しかし、文章の構造そのものに問題があるようです。だから、Microsoft 社自身は、認識が薄いようですが、英語自体がうまくないような気がします。読んだだけで理解するとは限りませんが、ある程度の指針にはなると思います。事実、以下では、あまりに自前の用語が多すぎて、一般の読者には通じません。Null(ナル)値さえ、一般の英語ネイティブでも理解できないはずです。英語では「ゼロ」のことだからです。
「vba InStr関数について」の回答画像5
    • good
    • 0

こんにちは。



私の書くのは、あくまでも参考です。必ずしも、質問者さんを満足させる解答とは違うかもしれません。もしも、ご質問が、VBAではないのでしたら、どうか、無視してください。

設問:VBA
>セル(3、2)に文字列 Excelマクロ(VBA)練習 が元データ
>VBAだけを抜き出し セル(3,3)に結果を出力する場合

最初に、
>= Mid(Cells(3, 2), InStr(Cells(3, 2), "(") + 1, InStr(Cells(3, 2), ")") - InStr(Cells(3, 2), "(") -
本来、このような書き方は、Lispなど、関数を中心としネストを得意というる言語に使うもので、VBAでは、あまり好まれません。むろん、書けないわけではありませんが、可読性をひどく落とします。それに、いくら書けても、Cellsのプロパティも、InStr関数のパラメータも省略して書くのは、あまり関心しません。

まず、それぞれを変数に格納しましょう。

今回の設問は、実務でも時々出てくるものですが、以下の重要なポイントは、i の判定です。i の判定をミスすると、実務ではエラーが発生することがあります。

'//
Sub Test1()
 Dim strText As String
 Dim i As Long, j As Long
 strText = Cells(3, 2).Value
 i = InStr(1, strText, "(", vbTextCompare) 'TextCompareは、'('全角・半角両方をサポートする
 j = InStr(i + 1, strText, ")", vbTextCompare) '括弧'('で見つけた次から')'を探す
 If i > 0 And j > 0 Then 'Mid関数のエラー対策
 'iが0だと、エラーになる
  Cells(3, 3).Value = Mid(strText, i + 1, j - i - 1)
 End If
End Sub
'//
B3に、Excelマクロ(VBA)練習
i は、「(」の位置
j は、i より右側の「)」の位置
j の一つ前の位置から、i の位置を引けば、その文字の長さが出ます。
(実際に数えてみれば分かりますが、[j - i - 1] は何文字目ではありません)

 MID関数は、MID(文字, 最初の位置, 文字の長さ)
取得したら、C3に出力します。

VBAは、ワークシート関数よりも、複雑なことをしています。
実務では、この方法と正規表現の抜き出しと両方を使い分けます。
    • good
    • 1
この回答へのお礼

ありがとうございます。正直ちょっとわかりませんが、あなた様の貴重な時間を使っていただいてこのようにご回答いただけることに感謝いたします。これを無駄にしない為、この内容がいつかわかるようなるまで頑張っていきたいと思います。 
本当にありがとうございました。

お礼日時:2018/07/19 21:41

No.1です。



VBAのInstr関数は通常のワークシート関数のFind関数と同じです。

基本はMID関数なので
=MID(対象文字列、開始位置、文字数)
です。

↓の画像で説明すると
D3セルに
=MID(B3,FIND("(",B3)+1,FIND(")",B3)-FIND("(",B3)-1)
という数式を入れフィルハンドルで下へコピーしています。

これとまったく同じことをお示しのコードはやっているだけです。

F~H列は順を追ってやっています。
F3セルは
=FIND("(",B3)
これでB3セルの ( が何文字目かを取得

G3セルは
=FIND(")",B3)
これでB3セルの ) が何文字目かを取得

H3セルは
=MID(B3,F3+1,G3-F3-1)
としています。

この操作を一気にやるとD3セルの数式になります。
すなわち
MID関数でB3セルの 6文字目から4文字(文字数)を表示!という関数になります。

※ 結論 ※
補足にある
>これは、13文字-8文字でしょうか? 13から8をひき文字数をもとめえいる?
の部分はMID関数の「文字数」に当たるので

>InStr(Cells(3, 2), "(")
で「9」が求められる場合は +1 としていますので、10文字目から

>InStr(Cells(3, 2), ")")
で「13」が求められる場合は
13-9-1
となり、
表示されるのは、10文字目から3文字!という結果になるはずです。m(_ _)m
「vba InStr関数について」の回答画像2
    • good
    • 1

こんにちは!



②のコードは10文字目から3文字!という意味ではありません。

B2セル内の ( ) で囲まれた文字列を取得するコードだと思います。

>InStr(Cells(3, 2), "(") + 1
で ( が頭から何文字目にあるか検索し、その次の文字から取得

>InStr(Cells(3, 2), ")")
で ) が何文字目にあるかを検索し、最後に
>- InStr(Cells(3, 2), "(") - 1
で表示する文字列の長さ(文字数)を示しています。

仮にB2セルの文字列が
あああああ(いうえお)かかかか
となっていれば

「いうえお」という文字列が取得できます。

すなわち ( が何文字目でも関係ありません。

※ お示しのコードでは ( ) は半角でないと反応しません。
(全角の場合はエラーになると思います。)m(_ _)m
この回答への補足あり
    • good
    • 1

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