
はじめまして,VBA初心者ですがよろしくお願いいたします。
今,データベースから文字列を抜き出してセルに等間隔で貼り付けるというプログラムを作成しています。
実際は,もっと複雑なプログラムなのですが質問のために簡単にしました。
Sub 例文()
For a = 1 To 10001
ggx = あるデータベース
Dim i As Integer
For i = 1 To 13
文字列 As String
文字列 = 文字列 & MidB(ggx, i * 80 + 95, 2)
Next i
.Cells(2 * a + 4, 1).Value = 文字列
Next a
End Sub
この式だと,セルに返したときに一番最初のセルには要求した文字列が
貼り付けられるのですが,次以降のセルには,要求した文字列に加えて前のセルの文字列も返されてしまい最終セルには,膨大な文字列が返されてしました。
ちなみに,詳しく書けなくて申し訳ないのですが変数aによってデータベースの内容は変化します。
MidB(ggx, i * 80 + 95, 2)
という関数でデータベースから条件に当てはまるいくつかの文字列を抜き出してセルに返すことまでは出来たのですが返し方がうまくいきません。
質問の仕方が下手で非常に申し訳ないのですがどうぞアドバイスをお願いします。
No.8ベストアンサー
- 回答日時:
多分こんな感じでいいんではないでしょうか?
基本的には「For a = 1 To 10001」の後で「For i = 1 To 13」の前で初期化してやる必要があると思います。
(.Cells(2 * a + 4, 1).Value = 文字列 のためのデータを取得し始める前に初期化する)
それと、確かにANo.5さんの指摘通り、Midbで取得したままcellに代入していると、量はともかく正しい値が表示されているのでしょうか・・・
Sub 例文()
For a = 1 To 10001
dim 文字列 As String'この上でもいいけど
文字列=""
ggx = あるデータベース
Dim i As Integer
For i = 1 To 13
文字列 = 文字列 & MidB(ggx, i * 80 + 95, 2)
Next i
.Cells(2 * a + 4, 1).Value = 文字列
Next a
End Sub
返事が遅くなり申し訳ありませんでした。アドバイスの通りやってみたら,見事に要求どおりに動いてくれました。ありがとうございました!!!
「文字列=""」はここに質問する前,試行錯誤やっている途中に,入力したことはあるのですが,「For i = To 13」の後に入力してしまい,要求どおりの効果を得られなかった記憶はあります。変数の属性決定のタイミングにより効果が違ってくるとは,VBAは奥が深いです・・・・
No.7
- 回答日時:
#5です。
スルーしようかとも思ったのですが、
#6の回答は、ホントに#5(vizzar)へのものなんでしょうか。
私は、
1.「文字列 As String」は変数の初期化を意図して置いたものだと理解した
2.ならば、「初期化が効いていないと判断」できないのかな
と思っただけでして。。。
No.6
- 回答日時:
回答者どうしのやりとりは禁止されているので、これ一回にします。
#5さんへ。だから、VBAの仕様がどうなってるかなんです。VB.Net(2002以降)では、質問者様のコードでも、ちゃんとした結果が出ます。ところがMSは、VBAはVBのサブセットだと言い切っているにも関わらず、現在の実態は、.Net以前のVB6仕様に現在のVBAは準拠しています。これは「VBA初心者」という事を考えれば、気づける範囲のものではありません。
現在のMSは「VBAはVBのサブセットだとは一言も述べていない」なんてのは、理由にならないと思います。そうであるならば、「MSは、ちゃんとそう言うべきです」。これは未必の故意と同じです。
以上、個人的意見です。
No.5
- 回答日時:
データベースの文字列は全てANKなのでしょうか?
2バイトコードがあるとMidB関数はヤバイですね。
因みに、「日本語」という文字列は、Mid関数では3文字です。
ANKの「ABC」もMid関数では3文字です。
つまり、Mid関数はバイト数でなく文字数で働きます。
本題のほうですが、
> 次以降のセルには,要求した文字列に加えて前のセルの文字列も返されてしまい
これを読んだ途端に「あ、初期化されていないな」と直ぐに感じました。
だとすると「文字列 As String」が効いていないと類推出来るハズなんですが...
No.4
- 回答日時:
#3さんの回答に大きなお世話です。
たぶん質問者様は、VBAのほかに、.Net以降のVBも知っていらっしゃるのではないかと思います。VBAはVBの完全なサブセット(機能限定版)というのがMSの公式見解ですが、現在は違います。
現在のVBAは、VB6のサブセット(.Net以前)です。#3さんも仰っているように、VB6のローカル宣言 Dim は、どこに書いても、プロシージャ内で一回きりの宣言となります。これに対して .Netでは、If や For Loop 内のブロック内ローカル宣言がサポートされています。
No.3
- 回答日時:
質問内の「文字列 As String」は「Dim 文字列 As String」のつもりだと思って話をします。
スコープ内でローカルな変数を使おうと宣言しているつもりでも・・・
VBAは期待している事をしてくれません。
こんな感じ
Sub test()
Dim i As Integer
For i = 1 To 5
Dim 文字列 As String'<-文字列=""の初期化も期待してるんだけど
If i = 2 Then
文字列 = "ABC"
End If
MsgBox 文字列
Next
End Sub
明示的に初期化すればいいだけの話なんですが、以降で初期化されてなければエラーを出して欲しい(チェックして欲しい)。
恐ろしいのは、これでエラーが出ない所です。
Sub test()
Dim i As Integer
For i = 1 To 5
Dim 文字列 As String
文字列 = "ABC"
Next
MsgBox 文字列
End Sub
本当に困ってしまうのは、こんな場合なんですよね。
ちょっとスコープ内でローカルな変数使いたいだけなんだけど・・・
Sub test()
Dim i As Integer
For i = 1 To 5
Dim 文字列 As String
文字列 = "ABC"
Next
For i = 1 To 5
Dim 文字列 As String '<-ここでエラーになる
文字列 = "DEF"
Next
End Sub
多分dimはどこにあってもプロシージャ内で先頭に(上の例でのDim i As Integerと同じ位置に)あるとするみたいです。
と言うわけで、「言語の仕様」ですので、そういう時は
Dim 文字列 As String
文字列=""
としましょう。
せめて
Dim 文字列 As String = ""
を許してくれると助かるんですが・・・
>質問内の「文字列 As String」は「Dim 文字列 As String」のつもりだと思って話をします。
私の入力誤りを見越してのご回答ありがとうございました。今回は非常にわかりやすい説明ありがとうございました。
No.2
- 回答日時:
質問をあまり理解できていませんし、
VBAから近年遠ざかっていますが、
なんとなく、こんな感じかな と思って書いてみます。
ループ内で文字列を一度初期化する必要があると思います。
(以下では、s = "" としました)
Sub 例文()
Dim ggx As String
Dim s As String
Dim a As Long
Dim i As Long
For a = 1 To 10001
ggx = "なにか文字列"
s = ""
For i = 1 To 13
s = s & MidB(ggx, i * 80 + 95, 2)
Next i
.Cells(2 * a + 4, 1).Value = s
Next a
End Sub
No.1
- 回答日時:
書かれてある通りの動作をしているとしか思えないのですが。
つなげたくないならつなげないようにすればよいかと思います。
文字列 = MidB(ggx, i * 80 + 95, 2)
ひょっとして的外れなんですかね?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 以下のVBAで該当文字列の前後に付与したい。 例 前に付与 abc ユーザーID 12345 後に付 3 2022/04/19 21:50
- Excel(エクセル) エクセルでA列セル内で折り返すことなく、文字列を、B列C列・・・側に一行に 2 2022/07/23 02:02
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Visual Basic(VBA) エクセルVBAについて 2 2023/01/31 16:21
- Excel(エクセル) VBA 特定の列に入っているテキストをコピペ 2 2023/06/14 11:24
- Visual Basic(VBA) EXCEL VBA 単語置き換え について質問です ブック名 ぶぶぶ シート名 ししし セル V3〜 3 2023/03/08 01:41
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Excel(エクセル) エクセルの条件付き書式で*を使いたい 4 2022/05/13 16:49
- Excel(エクセル) Excelに文字データのみを貼り付けたい 8 2023/05/03 15:38
- Excel(エクセル) Excelの関数についておしえてください。 3 2023/04/20 18:36
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでアルファベットか数...
-
VBAでの Replace関数で、ワイル...
-
Excelで3E8を3.00E+8にしない方...
-
EXCELで=より左の文字を一括で...
-
【Excel VBA】複数ある特定の文...
-
文字列からタブコードを取り除...
-
Excelで指数表現しないようにす...
-
エクセルで文字列をtxtファイル...
-
エクセルで文字列の最大値を抽...
-
VBA2005 16進を2桁で表示したい。
-
同一セル内に関数と文字列を同...
-
MS SQLServer のSQLで文字列の...
-
textboxユーザーコントロールの...
-
ORCLEでの小数の表示方法の変更...
-
Left関数とRight関数を合わせた...
-
アクセスで特定の数字以外(複...
-
エクセル 数値データを桁をそ...
-
UNIX:縦一列のファイルを横一行...
-
VBの「As String * 128」とは?
-
Msgboxの×が押されたとき
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
VBAでの Replace関数で、ワイル...
-
文字列からタブコードを取り除...
-
エクセルで文字列の最大値を抽...
-
Excelで指数表現しないようにす...
-
Excelで3E8を3.00E+8にしない方...
-
Left関数とRight関数を合わせた...
-
エクセル 数値データを桁をそ...
-
エクセルで文字列をtxtファイル...
-
VBA2005 16進を2桁で表示したい。
-
【Excel VBA】複数ある特定の文...
-
同一セル内に関数と文字列を同...
-
MS SQLServer のSQLで文字列の...
-
C#で年月を比較する
-
アクセスで特定の数字以外(複...
-
VBの「As String * 128」とは?
-
ORCLEでの小数の表示方法の変更...
-
Msgboxの×が押されたとき
-
aaa.bbb.ccc という、「ドット...
おすすめ情報