![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
こんにちは。いつもお世話になっております。
VBAについて聞きたいです。プログラムの経験は無かった為、どなたか教えていただけないでしょうか?
質問
下のテキストボックスに入力したテキストから、数値部分を抽出して、B列の18行目以降に列挙するボタンを作成してください。なお、数値は連続している間を一つの区切りとし、数値以外が出てきたら、別の値とします。
自分で書いたソースを添付しました。結果として数字が一個ずつ出力してしまい、どういう風に改善すべきかを教えて頂けないでしょうか?どうぞ宜しくお願い致します。
求める回答は、B18セルに123
B19セルに8979です。
以上です。
どうぞ宜しくお願い致します。
![「こんにちは。いつもお世話になっております」の質問画像](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/f/542740166_5ae3d2c36ab19/M.jpg)
No.5ベストアンサー
- 回答日時:
変更点:
Dim l As Long は、j に書き換えました。小文字L は 数字1と見間違えやすいからです。
For i = 1 To Len(a) + 1 は、末尾が数字の場合は、最後が素通りしてしまいますので、1を加えました。文字をそのまま加えるのは控えました。
数字をバッファする変数がひとつ足りないとしか思えません。
これは、学校の宿題か何かですか、実務とは少し違う性格のようです。
'//
Private Sub CommandButton1_Click()
Dim i As Long
Dim j As Long
Dim a As String
Dim b As String
Dim c As String
a = Me.TextBox1.Text
If a = "" Then Exit Sub ' at emptiness of TextBox1
For i = 1 To Len(a) + 1
b = Mid(a, i, 1)
If b Like "[0-9]" Then
c = c & b
Else
If IsNumeric(c) Then
j = j + 1
Range("B" & j + 17).Value = c
c = ""
End If
End If
Next
End Sub
'//
正規表現も一つの方法とは思いますが、私ならどうするか考えたみたものの画期的というほどのものはありませんでした。
No.4
- 回答日時:
No.1です。
1個ずつ調べるのも手間なので別の方法で。(問題点は既に指摘されてますし)
Private Sub CommandButton1_Click()
Dim re As Object
Dim match
Dim r As Range
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "\d+"
re.Global = True
Set r = Range("B18")
If re.Test(TextBox1.Text) Then
For Each match In re.Execute(TextBox1.Text)
r.Value = Val(match)
Set r = r.Offset(1)
Next
End If
Set re = Nothing
Set r = Nothing
End Sub
No.3
- 回答日時:
こんな感じでしょうか。
ちょっと勘違いている箇所があるように見えます
・Midで抽出した文字をbに入れるのに、ifではaをチェックしている
aはMe.TextBox1.Textをそのまま入れただけなので、If a Like "[0-9]" は必ずELSEを通ります。
・Midで抽出した文字をbに入れるなら、連結させるには c = c & bにします。
・Me.TextBox1.Textの最終文字が数字の場合、Else If IsNumeric()を通りませんので、
aの最終文字を数字以外にする必要があります。
私が修正したコードも穴があるかも知れませんが、
目的の結果が出ました。
![「こんにちは。いつもお世話になっております」の回答画像3](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/a/1191205_5ae3ec8c3d05e/M.jpg)
No.2
- 回答日時:
Clickイベントを
dim i as integer, j as integer
dim a as string, b as string
j = 0
' TextBox1のTextプロパティを基準にForループを実行
for i = 1 to len(TextBox1.Text)
' 変数 aに1文字ごと代入
a = mid(TextBox1.text, i, 1)
' 文字の検査
if a like "[0-9]" then
' 文字列の蓄積
b = b & a
else
' 数字以外文字がきたら
if isNumeric(b) then
' B18以降に代入
range("B18").Offset(j).Value = b
' 処理後は 変数bを初期化
b = ""
j = j + 1
end if
end if
next
' 未処理の文字列がある場合
if b<> "" and IsNumeric(b) then
range("B18").Offset(j).Value = b
j = j + 1
end if
といった具合で …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルVBAでセルに表示されているとおりの数値を取得したい(時間の計算結果) 1 2022/03/30 17:52
- Excel(エクセル) エクセルでエラーを無視して一番左側のセルの値を返したい 2 2023/07/27 13:06
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Visual Basic(VBA) A列にある値をB列・C列にVBAで切り出し 3 2022/04/09 19:20
- Visual Basic(VBA) エクセルVBAで『A列』に新規で数値を入力し『B列』から右方向の空白セルにその値を貼り付ける方法 4 2022/11/05 08:37
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- Excel(エクセル) エクセル 自動計算 1 2023/01/30 13:28
- Visual Basic(VBA) Excel(VBA) 特定の条件に該当する行の値、書式を同じセルにコピ&ペーストしたいです 1 2022/05/21 18:18
- Visual Basic(VBA) VBAで自動集計(特定セルコピー月ごとに値貼り付け)したい。 6 2023/06/25 11:37
- Visual Basic(VBA) 列を指定して値を左から5文字にそろえる 1 2022/06/10 20:28
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgets関数を使用したときの文字...
-
fgetsで拾われる改行文字を削除...
-
CStringのFindで文字列検索を行...
-
fgetsでバッファ残留文字列を無...
-
単語数のカウントについて
-
反転した数値を表示させるやり方
-
sscanfとscanfの違いがよくわか...
-
全角文字のチェック
-
C言語で16進数文字列から16進数...
-
sscanfでフォーマットに合って...
-
ファイルを読み込みテキストフ...
-
c言語プログラミングHELP!
-
小文字のみを数える方法
-
itoaわかりません
-
c言語について array[i]-‘0’ こ...
-
C言語、単語ごとに改行したい
-
数字のINPUT
-
gets fgetsについて
-
”123456”といった整数を文字列...
-
Cで「大文字、小文字の判定」は...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
sscanfとscanfの違いがよくわか...
-
fgets関数を使用したときの文字...
-
反転した数値を表示させるやり方
-
Cで「大文字、小文字の判定」は...
-
charと%c , %s の関係について
-
C言語のステップ数をカウントす...
-
strstrを利用しない文字列検索...
-
C言語 空白の行(改行のみ)が...
-
fgetsで拾われる改行文字を削除...
-
文字列中に含まれる文字の個数...
-
C言語で16進数文字列から16進数...
-
itoaわかりません
-
文の意味
-
C言語 strlen 再入力を促す
-
fgetsでバッファ残留文字列を無...
-
全角文字のチェック
-
C++
-
ブランクのチェック
-
C言語、単語ごとに改行したい
おすすめ情報