
こんにちは。
関数というより使い方がわかりません。
どなたかおしえてください。
セル(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 文字目
以上 よろしくお願いいたします。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
#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(ナル)値さえ、一般の英語ネイティブでも理解できないはずです。英語では「ゼロ」のことだからです。

No.3
- 回答日時:
こんにちは。
私の書くのは、あくまでも参考です。必ずしも、質問者さんを満足させる解答とは違うかもしれません。もしも、ご質問が、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は、ワークシート関数よりも、複雑なことをしています。
実務では、この方法と正規表現の抜き出しと両方を使い分けます。
ありがとうございます。正直ちょっとわかりませんが、あなた様の貴重な時間を使っていただいてこのようにご回答いただけることに感謝いたします。これを無駄にしない為、この内容がいつかわかるようなるまで頑張っていきたいと思います。
本当にありがとうございました。
No.2
- 回答日時:
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

No.1
- 回答日時:
こんにちは!
②のコードは10文字目から3文字!という意味ではありません。
B2セル内の ( ) で囲まれた文字列を取得するコードだと思います。
>InStr(Cells(3, 2), "(") + 1
で ( が頭から何文字目にあるか検索し、その次の文字から取得
>InStr(Cells(3, 2), ")")
で ) が何文字目にあるかを検索し、最後に
>- InStr(Cells(3, 2), "(") - 1
で表示する文字列の長さ(文字数)を示しています。
仮にB2セルの文字列が
あああああ(いうえお)かかかか
となっていれば
「いうえお」という文字列が取得できます。
すなわち ( が何文字目でも関係ありません。
※ お示しのコードでは ( ) は半角でないと反応しません。
(全角の場合はエラーになると思います。)m(_ _)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Excel(エクセル) VBAで “:” を含むセルの特定 2 2023/05/11 16:30
- Visual Basic(VBA) A2セルの値が「100021_りんご01青森県」からInStrで「りんご」を抽出したい。 セルの値が 5 2022/08/15 09:42
- Visual Basic(VBA) vba 等間隔の列に対しての計算 6 2022/05/17 20:15
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/02/02 09:25
- Visual Basic(VBA) 以下のVBAで該当文字列の前後に付与したい。 例 前に付与 abc ユーザーID 12345 後に付 3 2022/04/19 21:50
- Visual Basic(VBA) 実行時エラー´5854´ 文字列型パラメーターが長すぎます。 3 2023/06/08 21:17
- Visual Basic(VBA) i=cells(Rows.Count, 1)とi=cells(Rows.Count, 2)の違い 2 2022/04/06 10:04
- Visual Basic(VBA) Excel VBA キーワードから列を取得して、さらに空欄行を非表示にする 3 2022/10/21 22:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセル: セルの枠を超えて表示
-
Excel countif関数で取り消し線...
-
セル内の一部の文字だけをハイ...
-
セルは大きくさせず、中の文字...
-
エクセルファイルに _x000D_ と...
-
CSVファイルでテキストの改行の...
-
Excel入力で勝手にエンター押さ...
-
エクセルでセルを上下に結合し...
-
全セルの末尾に改行(Alt+Enter...
-
エクセルで文字を打つと下に、...
-
エクセルで1つのセルにスクロ...
-
エクセル2013で英単語を折り返...
-
エクセルで画像を透過させて画...
-
JIS水準漢字の選別方法教えてく...
-
エクセルの白黒の反転で困って...
-
エクセルでセルの余白を作りたい
-
エクセルで文字列の結合したと...
-
Excel 2010でひとつのセル内に...
-
セルを結合しても、文字をセル...
-
セルを結合して中央揃えを行う...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセル: セルの枠を超えて表示
-
Excel countif関数で取り消し線...
-
セル内の一部の文字だけをハイ...
-
セルは大きくさせず、中の文字...
-
エクセルでセルを上下に結合し...
-
マウスポインターが白十字のまま
-
エクセルで1つのセルにスクロ...
-
エクセルファイルに _x000D_ と...
-
エクセル2013で英単語を折り返...
-
Excelでcsvやtxtで保存する時に...
-
エクセルの白黒の反転で困って...
-
セルを結合しても、文字をセル...
-
Excel入力で勝手にエンター押さ...
-
CSVファイルでテキストの改行の...
-
エクセルの入力規則プルダウン...
-
エクセルで画像を透過させて画...
-
全セルの末尾に改行(Alt+Enter...
-
セルを結合して中央揃えを行う...
-
マウスを使わずにセルにカーソ...
-
エクセルのセル外改行は可能で...
おすすめ情報
ありがとうございます。
おしえてください。
>InStr(Cells(3, 2), "(") + 1
で ( が頭から何文字目にあるか検索し、その次の文字から取得
>10文字目
>InStr(Cells(3, 2), ")")
で ) が何文字目にあるかを検索し、
>13文字目
>- InStr(Cells(3, 2), "(") - 1
で表示する文字列の長さ(文字数)を示しています。8文字?
文字列の長さ(文字数)は5になるのでしょうか?
これは、13文字-8文字でしょうか? 13から8をひき文字数をもとめえいる?