teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2020/04/17 03:54

投稿

mattuwan
mattuwan

スコア2167

answer CHANGED
@@ -13,4 +13,121 @@
13
13
 
14
14
  そもそも、結果として返すキーワードは決まっているので、
15
15
  敢えて文字列の中から切り出す必要が見えません。
16
- なんの課題か知りませんが、何かを勘違いしてませんか?
16
+ なんの課題か知りませんが、何かを勘違いしてませんか?
17
+
18
+ ---
19
+ 追記
20
+ > 課題では「Left関数」を使うと指定していますのですが、
21
+ > InStrのみでプログラムが出来ることを知り大変勉強になります。
22
+
23
+ 課題が本当にそういう課題なのか、疑問はありますが、
24
+ hatena19さんの最初のサンプルは、
25
+ キーワードの有無を確認しているだけで、
26
+ 文字列から指定した文字列を取り出しているわけではないのは、
27
+ 理解されているのでしょうか?
28
+
29
+ かぶりますが、こちらも回答を用意してたので、一応書いておきます。
30
+
31
+ ```ExcelVBA
32
+ 'キーワード「グレープ」の有無の確認サンプル
33
+ Sub test1()
34
+ Const ss As String = "オレンジグレープアップル"
35
+ Dim s As String
36
+ Dim i As Long
37
+
38
+ 'テストデータのセット
39
+ Range("A1").Value = ss
40
+ '検索キーワードの用意
41
+ s = "グレープ"
42
+ 'キーワード「グレープ」の検索(返り値は何文字目かの位置)
43
+ i = InStr(Range("A1").Value, s)
44
+
45
+ 'キーワードが指定の文字列中にあれば、キーワードをセット
46
+ If i > 0 Then
47
+ Range("A2").Value = s
48
+ Else
49
+ Range("A2").Value = "無し"
50
+ End If
51
+ End Sub
52
+ ```
53
+ 普通、文字列の途中から取り出したい文字がある場合は、
54
+ Mid関数を使います。
55
+ ヘルプより
56
+ > Mid 関数
57
+ > 関連項目 使用例 アプリケーション情報
58
+ >
59
+ > バリアント型 (内部処理形式 String の Variant) の値を返します。文字列から指定した文字数分の文字列を返します。
60
+ >
61
+ > 構文
62
+ >
63
+ > Mid(string, start[, length])
64
+ >
65
+ > Mid 関数の構文は、次の名前付き引数から構成されます。
66
+ >
67
+ > 指定項目 内容
68
+ > string 必ず指定します。文字列を取り出す、元の文字列式を指定します。名前付き引数 string に Null 値が含まれている場合は、Null 値を返します。
69
+ > start 必ず指定します。長整数型 (Long) の値を指定します。名前付き引数 string の先頭の位置を 1 として、どの位置から文字列を取り出すかを先頭からの文字数で指定します。start が string の文字数を超える場合、Mid 関数は長さ 0 の文字列 ("") を返します。
70
+ > length 省略可能です。バリアント型 (内部処理形式 Long) の値を指定します。取り出す文字数を指定します。名前付き引数 length を省略した場合、または文字列内に length より短い文字数しかない場合には、start から後のすべての文字が返されます。
71
+
72
+ ```ExcelVBA
73
+ 'キーワード「グレープ」を文字列の途中から取り出す
74
+ Sub test2()
75
+ Const ss As String = "オレンジグレープアップル"
76
+ Dim s As String
77
+ Dim i As Long
78
+ Dim n As Long
79
+
80
+ 'テストデータのセット
81
+ Range("A1").Value = ss
82
+ '検索キーワードの用意
83
+ s = "グレープ"
84
+ 'キーワード「グレープ」の検索(返り値は何文字目かの位置)
85
+ i = InStr(Range("A1").Value, s)
86
+
87
+ 'キーワードが指定の文字列中にあれば、
88
+ If i > 0 Then
89
+ '取り出す文字数の取得
90
+ n = Len(s)
91
+ s = Mid(Range("A1").Value, i, n)
92
+ Range("A2").Value = s
93
+ Else
94
+ Range("A2").Value = "無し"
95
+ End If
96
+ End Sub
97
+ ```
98
+ ただ、上記だと変数sの値が変わるわけではないので、
99
+ s = Mid(Range("A1").Value, i, n)
100
+ こんなことをする必要がないですよね?
101
+
102
+ あくまで課題が、
103
+ 「左から何文字目までかを取りす」ということならば、
104
+ グレープの前までの文字列を取り出す。
105
+ という例が想像されます。(こういうことと勘違いされてるのかなと思いました。)
106
+
107
+ ```ExcelVBA
108
+ 'キーワード「グレープ」の左側を取り出す
109
+ Sub test3()
110
+ Const ss As String = "オレンジグレープアップル"
111
+ Dim s As String
112
+ Dim i As Long
113
+
114
+ 'テストデータのセット
115
+ Range("A1").Value = ss
116
+ '検索キーワードの用意
117
+ s = "グレープ"
118
+ 'キーワード「グレープ」の検索(返り値は何文字目かの位置)
119
+ i = InStr(Range("A1").Value, s)
120
+
121
+ 'キーワードが指定の文字列中にあれば
122
+ If i > 0 Then
123
+ '左から見つけた位置の前までの文字列を取り出す
124
+ s = Left(Range("A1").Value, i - 1)
125
+ Range("A2").Value = s
126
+ Else
127
+ Range("A2").Value = "無し"
128
+ End If
129
+ End Sub
130
+ ```
131
+
132
+ グレープを与えて、オレンジを返す。
133
+ こういう事ならやって意味があるかなぁと思いました。