こんにちは。いつもお世話になっております。
VBAについて聞きたいです。プログラムの経験は無かった為、どなたか教えていただけないでしょうか?
質問
下のテキストボックスに入力したテキストから、数値部分を抽出して、B列の18行目以降に列挙するボタンを作成してください。なお、数値は連続している間を一つの区切りとし、数値以外が出てきたら、別の値とします。
自分で書いたソースを添付しました。結果として数字が一個ずつ出力してしまい、どういう風に改善すべきかを教えて頂けないでしょうか?どうぞ宜しくお願い致します。
求める回答は、B18セルに123
B19セルに8979です。
以上です。
どうぞ宜しくお願い致します。
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の最終文字を数字以外にする必要があります。
私が修正したコードも穴があるかも知れませんが、
目的の結果が出ました。
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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文の意味
-
sscanfとscanfの違いがよくわか...
-
C言語のステップ数をカウントす...
-
AtCoderABC135の問題Cについて
-
「指定されたキャストは有効で...
-
2÷3などの余りについて
-
Enterキーを押されたら次の処理...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
マイナスからプラスへ転じた時...
-
信頼区間の1.96や1.65ってどこ...
-
C++でvectorにテキストファイル...
-
プログラムでの数字につく”f”の...
-
WindowsでEOF
-
O(n log n)について2
-
double型の値をchar配列に変換...
-
関数とビット列
-
std::set<int> で、ある値が何...
-
DWORDの実際の型は何でしょうか
-
値差の%計算方法について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
sscanfとscanfの違いがよくわか...
-
fgets関数を使用したときの文字...
-
charと%c , %s の関係について
-
反転した数値を表示させるやり方
-
strstrを利用しない文字列検索...
-
C言語 空白の行(改行のみ)が...
-
C言語、単語ごとに改行したい
-
itoaわかりません
-
C言語のステップ数をカウントす...
-
fgetsで拾われる改行文字を削除...
-
C言語で16進数文字列から16進数...
-
Cで「大文字、小文字の判定」は...
-
CStringについて
-
C言語の課題です
-
文字列中に含まれる文字の個数...
-
単語数のカウントについて
-
文の意味
-
fgetsでバッファ残留文字列を無...
-
putsとputcharの違い?
おすすめ情報