前提・実現したいこと
課題で以下の問題があります。
A1のセルの文字「オレンジグレープアップル」をVBAでInStr関数とLeft関数を使ってA1から「グレープ」抽出してA2に表示する。
上記2つの関数を使用して問題を回答するこができていません。
■■な機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
該当のソースコード
VBA
1
試したこと
VBA
1Sub できない() 2 Range("a2").Value = Left(Cells(1, 1), InStr("オレンジグレープアップル", "グレープ")) 3End Sub
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
vba
1Sub InStrのみでできる() 2 If InStr(Range("A1").Value, "グレープ") > 0 Then 3 Range("A2").Value = "グレープ" 4 Else 5 Range("A2").Value = "" 6 End If 7End Sub
Leftのみではどう頑張っても文字列の途中の文字を取り出すのは無理。Midを使えば可能だが。
vba
1Sub Midならできる() 2 Dim S1, S2, pos 3 S1 = Range("A1").Value 4 S2 = "グレープ" 5 pos = InStr(S1,S2) 6 Range("A2").Value = Mid(S1,pos,len(S2)) 7End Sub
投稿2020/04/16 11:47
編集2020/04/16 12:06総合スコア34075
0
ベストアンサー
①抽出ですので「グレープ」を抜き出したいです。
②課題では「InStr関数とLeft関数」のみとなっています。
↓ヘルプより抜粋
Left 関数
バリアント型 (内部処理形式 String の Variant) の値を返します。
文字列の左端から指定した文字数分の文字列を返します。
なのでLeft関数で、「グレープ」という文字列を切り出すのは不可能です。
こういう、文字列の中から特定の文字を切り出す作業、「抽出」っていうのかなぁ。。。。?
そもそも、結果として返すキーワードは決まっているので、
敢えて文字列の中から切り出す必要が見えません。
なんの課題か知りませんが、何かを勘違いしてませんか?
追記
課題では「Left関数」を使うと指定していますのですが、
InStrのみでプログラムが出来ることを知り大変勉強になります。
課題が本当にそういう課題なのか、疑問はありますが、
hatena19さんの最初のサンプルは、
キーワードの有無を確認しているだけで、
文字列から指定した文字列を取り出しているわけではないのは、
理解されているのでしょうか?
かぶりますが、こちらも回答を用意してたので、一応書いておきます。
ExcelVBA
1'キーワード「グレープ」の有無の確認サンプル 2Sub test1() 3 Const ss As String = "オレンジグレープアップル" 4 Dim s As String 5 Dim i As Long 6 7 'テストデータのセット 8 Range("A1").Value = ss 9 '検索キーワードの用意 10 s = "グレープ" 11 'キーワード「グレープ」の検索(返り値は何文字目かの位置) 12 i = InStr(Range("A1").Value, s) 13 14 'キーワードが指定の文字列中にあれば、キーワードをセット 15 If i > 0 Then 16 Range("A2").Value = s 17 Else 18 Range("A2").Value = "無し" 19 End If 20End Sub
普通、文字列の途中から取り出したい文字がある場合は、
Mid関数を使います。
ヘルプより
Mid 関数
関連項目 使用例 アプリケーション情報バリアント型 (内部処理形式 String の Variant) の値を返します。文字列から指定した文字数分の文字列を返します。
構文
Mid(string, start[, length])
Mid 関数の構文は、次の名前付き引数から構成されます。
指定項目 内容
string 必ず指定します。文字列を取り出す、元の文字列式を指定します。名前付き引数 string に Null 値が含まれている場合は、Null 値を返します。
start 必ず指定します。長整数型 (Long) の値を指定します。名前付き引数 string の先頭の位置を 1 として、どの位置から文字列を取り出すかを先頭からの文字数で指定します。start が string の文字数を超える場合、Mid 関数は長さ 0 の文字列 ("") を返します。
length 省略可能です。バリアント型 (内部処理形式 Long) の値を指定します。取り出す文字数を指定します。名前付き引数 length を省略した場合、または文字列内に length より短い文字数しかない場合には、start から後のすべての文字が返されます。
ExcelVBA
1'キーワード「グレープ」を文字列の途中から取り出す 2Sub test2() 3 Const ss As String = "オレンジグレープアップル" 4 Dim s As String 5 Dim i As Long 6 Dim n As Long 7 8 'テストデータのセット 9 Range("A1").Value = ss 10 '検索キーワードの用意 11 s = "グレープ" 12 'キーワード「グレープ」の検索(返り値は何文字目かの位置) 13 i = InStr(Range("A1").Value, s) 14 15 'キーワードが指定の文字列中にあれば、 16 If i > 0 Then 17 '取り出す文字数の取得 18 n = Len(s) 19 s = Mid(Range("A1").Value, i, n) 20 Range("A2").Value = s 21 Else 22 Range("A2").Value = "無し" 23 End If 24End Sub
ただ、上記だと変数sの値が変わるわけではないので、
s = Mid(Range("A1").Value, i, n)
こんなことをする必要がないですよね?
あくまで課題が、
「左から何文字目までかを取りす」ということならば、
グレープの前までの文字列を取り出す。
という例が想像されます。(こういうことと勘違いされてるのかなと思いました。)
ExcelVBA
1'キーワード「グレープ」の左側を取り出す 2Sub test3() 3 Const ss As String = "オレンジグレープアップル" 4 Dim s As String 5 Dim i As Long 6 7 'テストデータのセット 8 Range("A1").Value = ss 9 '検索キーワードの用意 10 s = "グレープ" 11 'キーワード「グレープ」の検索(返り値は何文字目かの位置) 12 i = InStr(Range("A1").Value, s) 13 14 'キーワードが指定の文字列中にあれば 15 If i > 0 Then 16 '左から見つけた位置の前までの文字列を取り出す 17 s = Left(Range("A1").Value, i - 1) 18 Range("A2").Value = s 19 Else 20 Range("A2").Value = "無し" 21 End If 22End Sub
グレープを与えて、オレンジを返す。
こういう事ならやって意味があるかなぁと思いました。
投稿2020/04/16 12:02
編集2020/04/17 03:54総合スコア2163
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。