質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

1601閲覧

VBAでInStr関数とLeft関数を使って文字を出力したい

heine

総合スコア10

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/04/16 10:26

前提・実現したいこと

課題で以下の問題があります。

A1のセルの文字「オレンジグレープアップル」をVBAでInStr関数とLeft関数を使ってA1から「グレープ」抽出してA2に表示する。

上記2つの関数を使用して問題を回答するこができていません。

■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

該当のソースコード

VBA

1

試したこと

VBA

1Sub できない() 2 Range("a2").Value = Left(Cells(1, 1), InStr("オレンジグレープアップル", "グレープ")) 3End Sub

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2020/04/16 10:41

文字列から`グレープ`を取り除くのではないのですか?
meg_

2020/04/16 11:09

使用するのは「InStr関数とLeft関数」のみですか?
heine

2020/04/16 11:39

コメントありがとうございます。 ①抽出ですので「グレープ」を抜き出したいです。 ②課題では「InStr関数とLeft関数」のみとなっています。
sazi

2020/04/16 11:49

len関数は使用可ですか?
heine

2020/04/16 12:04

再度コメントありがとうございます。 もしlen関数を用いないと実現不可能であれば使用可能です。
guest

回答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
hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

heine

2020/04/16 12:00

回答ありがとうございます。 課題では「Left関数」を使うと指定していますのですが、InStrのみでプログラムが出来ることを知り大変勉強になります。
heine

2020/04/17 07:08

hatena19さん mid関数での解説ありがとうございます。 おかげさまで、left関数mid関数の理解を深めることができました。 ありがとうございます。
guest

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
mattuwan

総合スコア2163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatena19

2020/04/16 12:07

> 何かを勘違いしてませんか? 同感。
ttyp03

2020/04/16 23:40

同じく同感。 もう抽出されてるっての。
heine

2020/04/17 07:05

mattuwanさん 多くの解説ありがとうございました。 出題者に問い合わせてみたところ、課題に問題アリと認識しておりました。 曖昧な質問に丁寧にお答えいただき、感謝と申し訳なさを感じております。 いただいたコードと解説を元に、これから課題の変更をする予定です。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問