回答編集履歴

1

追記

2020/04/17 03:54

投稿

mattuwan
mattuwan

スコア2163

test CHANGED
@@ -29,3 +29,237 @@
29
29
  敢えて文字列の中から切り出す必要が見えません。
30
30
 
31
31
  なんの課題か知りませんが、何かを勘違いしてませんか?
32
+
33
+
34
+
35
+ ---
36
+
37
+ 追記
38
+
39
+ > 課題では「Left関数」を使うと指定していますのですが、
40
+
41
+ > InStrのみでプログラムが出来ることを知り大変勉強になります。
42
+
43
+
44
+
45
+ 課題が本当にそういう課題なのか、疑問はありますが、
46
+
47
+ hatena19さんの最初のサンプルは、
48
+
49
+ キーワードの有無を確認しているだけで、
50
+
51
+ 文字列から指定した文字列を取り出しているわけではないのは、
52
+
53
+ 理解されているのでしょうか?
54
+
55
+
56
+
57
+ かぶりますが、こちらも回答を用意してたので、一応書いておきます。
58
+
59
+
60
+
61
+ ```ExcelVBA
62
+
63
+ 'キーワード「グレープ」の有無の確認サンプル
64
+
65
+ Sub test1()
66
+
67
+ Const ss As String = "オレンジグレープアップル"
68
+
69
+ Dim s As String
70
+
71
+ Dim i As Long
72
+
73
+
74
+
75
+ 'テストデータのセット
76
+
77
+ Range("A1").Value = ss
78
+
79
+ '検索キーワードの用意
80
+
81
+ s = "グレープ"
82
+
83
+ 'キーワード「グレープ」の検索(返り値は何文字目かの位置)
84
+
85
+ i = InStr(Range("A1").Value, s)
86
+
87
+
88
+
89
+ 'キーワードが指定の文字列中にあれば、キーワードをセット
90
+
91
+ If i > 0 Then
92
+
93
+ Range("A2").Value = s
94
+
95
+ Else
96
+
97
+ Range("A2").Value = "無し"
98
+
99
+ End If
100
+
101
+ End Sub
102
+
103
+ ```
104
+
105
+ 普通、文字列の途中から取り出したい文字がある場合は、
106
+
107
+ Mid関数を使います。
108
+
109
+ ヘルプより
110
+
111
+ > Mid 関数
112
+
113
+ > 関連項目 使用例 アプリケーション情報
114
+
115
+ >
116
+
117
+ > バリアント型 (内部処理形式 String の Variant) の値を返します。文字列から指定した文字数分の文字列を返します。
118
+
119
+ >
120
+
121
+ > 構文
122
+
123
+ >
124
+
125
+ > Mid(string, start[, length])
126
+
127
+ >
128
+
129
+ > Mid 関数の構文は、次の名前付き引数から構成されます。
130
+
131
+ >
132
+
133
+ > 指定項目 内容
134
+
135
+ > string 必ず指定します。文字列を取り出す、元の文字列式を指定します。名前付き引数 string に Null 値が含まれている場合は、Null 値を返します。
136
+
137
+ > start 必ず指定します。長整数型 (Long) の値を指定します。名前付き引数 string の先頭の位置を 1 として、どの位置から文字列を取り出すかを先頭からの文字数で指定します。start が string の文字数を超える場合、Mid 関数は長さ 0 の文字列 ("") を返します。
138
+
139
+ > length 省略可能です。バリアント型 (内部処理形式 Long) の値を指定します。取り出す文字数を指定します。名前付き引数 length を省略した場合、または文字列内に length より短い文字数しかない場合には、start から後のすべての文字が返されます。
140
+
141
+
142
+
143
+ ```ExcelVBA
144
+
145
+ 'キーワード「グレープ」を文字列の途中から取り出す
146
+
147
+ Sub test2()
148
+
149
+ Const ss As String = "オレンジグレープアップル"
150
+
151
+ Dim s As String
152
+
153
+ Dim i As Long
154
+
155
+ Dim n As Long
156
+
157
+
158
+
159
+ 'テストデータのセット
160
+
161
+ Range("A1").Value = ss
162
+
163
+ '検索キーワードの用意
164
+
165
+ s = "グレープ"
166
+
167
+ 'キーワード「グレープ」の検索(返り値は何文字目かの位置)
168
+
169
+ i = InStr(Range("A1").Value, s)
170
+
171
+
172
+
173
+ 'キーワードが指定の文字列中にあれば、
174
+
175
+ If i > 0 Then
176
+
177
+ '取り出す文字数の取得
178
+
179
+ n = Len(s)
180
+
181
+ s = Mid(Range("A1").Value, i, n)
182
+
183
+ Range("A2").Value = s
184
+
185
+ Else
186
+
187
+ Range("A2").Value = "無し"
188
+
189
+ End If
190
+
191
+ End Sub
192
+
193
+ ```
194
+
195
+ ただ、上記だと変数sの値が変わるわけではないので、
196
+
197
+ s = Mid(Range("A1").Value, i, n)
198
+
199
+ こんなことをする必要がないですよね?
200
+
201
+
202
+
203
+ あくまで課題が、
204
+
205
+ 「左から何文字目までかを取りす」ということならば、
206
+
207
+ グレープの前までの文字列を取り出す。
208
+
209
+ という例が想像されます。(こういうことと勘違いされてるのかなと思いました。)
210
+
211
+
212
+
213
+ ```ExcelVBA
214
+
215
+ 'キーワード「グレープ」の左側を取り出す
216
+
217
+ Sub test3()
218
+
219
+ Const ss As String = "オレンジグレープアップル"
220
+
221
+ Dim s As String
222
+
223
+ Dim i As Long
224
+
225
+
226
+
227
+ 'テストデータのセット
228
+
229
+ Range("A1").Value = ss
230
+
231
+ '検索キーワードの用意
232
+
233
+ s = "グレープ"
234
+
235
+ 'キーワード「グレープ」の検索(返り値は何文字目かの位置)
236
+
237
+ i = InStr(Range("A1").Value, s)
238
+
239
+
240
+
241
+ 'キーワードが指定の文字列中にあれば
242
+
243
+ If i > 0 Then
244
+
245
+ '左から見つけた位置の前までの文字列を取り出す
246
+
247
+ s = Left(Range("A1").Value, i - 1)
248
+
249
+ Range("A2").Value = s
250
+
251
+ Else
252
+
253
+ Range("A2").Value = "無し"
254
+
255
+ End If
256
+
257
+ End Sub
258
+
259
+ ```
260
+
261
+
262
+
263
+ グレープを与えて、オレンジを返す。
264
+
265
+ こういう事ならやって意味があるかなぁと思いました。