dポイントプレゼントキャンペーン実施中!

こんにちは。いつもお世話になっております。
VBAについて聞きたいです。プログラムの経験は無かった為、どなたか教えていただけないでしょうか?

質問
下のテキストボックスに入力したテキストから、数値部分を抽出して、B列の18行目以降に列挙するボタンを作成してください。なお、数値は連続している間を一つの区切りとし、数値以外が出てきたら、別の値とします。

自分で書いたソースを添付しました。結果として数字が一個ずつ出力してしまい、どういう風に改善すべきかを教えて頂けないでしょうか?どうぞ宜しくお願い致します。

求める回答は、B18セルに123
B19セルに8979です。

以上です。
どうぞ宜しくお願い致します。

「こんにちは。いつもお世話になっております」の質問画像

A 回答 (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

'//

正規表現も一つの方法とは思いますが、私ならどうするか考えたみたものの画期的というほどのものはありませんでした。
    • good
    • 1

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
    • good
    • 1

こんな感じでしょうか。



ちょっと勘違いている箇所があるように見えます
・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
    • good
    • 1

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

といった具合で …
    • good
    • 1

画像では良く見えないし、何より回答者も打ち込まないといけないのは手間をかけさせると思いますよ



コードをコピペで貼り付けるだけで済んだのではないのかな?
    • good
    • 2

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!