はじめまして,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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・ハマっている「お菓子」を教えて!
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでアルファベットか数...
-
文字列からタブコードを取り除...
-
VBAでの Replace関数で、ワイル...
-
EXCELで=より左の文字を一括で...
-
Msgboxの×が押されたとき
-
Excelで指数表現しないようにす...
-
Excelで3E8を3.00E+8にしない方...
-
MS SQLServer のSQLで文字列の...
-
VBA 1つのセルに入っている値の...
-
VBA2005 16進を2桁で表示したい。
-
VBAを使って選択した範囲の数字...
-
Left関数とRight関数を合わせた...
-
エクセル 数値データを桁をそ...
-
エクセルで文字列をtxtファイル...
-
文字列からカンマを取り除きたい
-
複数文字列から共通文字列の抽...
-
SQL の Update文(?) と ...
-
エクセルで一つのセル内の特定...
-
VB6のReplace関数の使い方
-
()を含む文字列を検索
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
文字列からタブコードを取り除...
-
VBAでの Replace関数で、ワイル...
-
Excelで3E8を3.00E+8にしない方...
-
エクセルで文字列をtxtファイル...
-
Excelで指数表現しないようにす...
-
【Excel VBA】複数ある特定の文...
-
Left関数とRight関数を合わせた...
-
エクセルで文字列の最大値を抽...
-
同一セル内に関数と文字列を同...
-
VBA2005 16進を2桁で表示したい。
-
VBの「As String * 128」とは?
-
MS SQLServer のSQLで文字列の...
-
エクセル 数値データを桁をそ...
-
C#で年月を比較する
-
16進数を10進数に簡単に変換す...
-
“丸(〇/○/◯)”に似た文字…
-
アクセスで特定の数字以外(複...
-
Msgboxの×が押されたとき
おすすめ情報