配列で次元の拡張ができない | |
---|---|
[195129] 配列で次元の拡張ができない- ■親トピック/記事引用/メール受信=OFF■ □投稿者/ 無職勉強中 -(2022/08/26(16:54)) □U R L/ Dim mainbuf As Variant mainbuf = Range(Range("A1"), Range("A10")) mainbuf(3, 2) = "5" ------------------- ↑上記、最後の行で以下のエラーが出ます。配列を無理矢理拡張して文字列を入れるのはできないのでしょうか。 redimも使えないようですし、このやり方は諦めるしかないのでしょうか。 「実行エラー'9' インデックスが有効範囲にありません」 この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 ++++++++++++++++++++ OS ⇒OTHER Version⇒OTHER ++++++++++++++++++++ |
[195130] Re[1]: 配列で次元の拡張ができない- ■記事引用/メール受信=OFF■ □投稿者/ マナ -(2022/08/26(17:12)) □U R L/ B列に列を挿入 mainbuf = Range("A1:B10").Value B列を削除 この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[195132] Re[2]: 配列で次元の拡張ができない- ■記事引用/メール受信=OFF■ □投稿者/ マナ -(2022/08/26(17:25)) □U R L/ 列証入・削除より、どこか空いてる場所にコピーするほうがよかったかも。 |
[195133] Re[2]: 配列で次元の拡張ができない- ■記事引用/メール受信=OFF■ □投稿者/ 無職勉強中 -(2022/08/26(18:00)) □U R L/ ご回答ありがとうございます!! VBAの今ある関数ですとこのような次元の拡張はきっとできないんですね。 ちなみに、以下の"A10"やmainbuf(3, 2) の3や2という数値は実際はべた書きでなく、可変でして、しかもとても大きな数になることもあり、直接セルを一つずつ修正していくと処理に時間がかかると思い、一度仮の配列(mainbuf)にぶっ込んでそれを修正してからセルにバッとペーストすると早いかなと思い、そうしました。。 Dim mainbuf As Variant mainbuf = Range(Range("A1"), Range("A10")) mainbuf(3, 2) = "5" この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[195134] Re[3]: 配列で次元の拡張ができない- ■記事引用/メール受信=OFF■ □投稿者/ マナ -(2022/08/26(18:45)) □U R L/ 申し訳ありません。 具体的なようで、そうでもないような たぶん、例が不適切な気がします。 わたしには何をしたいか全く理解できません。 |
[195135] Re[4]: 配列で次元の拡張ができない- ■記事引用/メール受信=OFF■ □投稿者/ マナ -(2022/08/26(19:00)) □U R L/ こういうこと? mainbuf = Range("A1").Resize(1000,10).Value 実際は、1000とか10は変数にする。 この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[195136] Re[4]: 配列で次元の拡張ができない- ■記事引用/メール受信=OFF■ □投稿者/ 基礎学べ -(2022/08/26(19:04)) □U R L/ あんま答えたくないけど set mainbuf = Range(Range("A1"), Range("A10")) この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[195138] Re[5]: 配列で次元の拡張ができない- ■記事引用/メール受信=OFF■ □投稿者/ 半平太 -(2022/08/26(20:01)) □U R L/ 普通っぽくやってみましたけど、特に問題を感じませんでしたけど。 Sub Trial() Dim mainbuf As Variant Range("A1", Range("A10")) = [row(a1:a10)] mainbuf = Range("A1", Range("A10")) ReDim Preserve mainbuf(1 To 10, 1 To 2) mainbuf(3, 2) = "5" Range("D1", Range("E10")) = mainbuf ReDim mainbuf(1 To 3, 1 To 2) mainbuf(3, 2) = "A" Range("F1", Range("G3")) = mainbuf End Sub 行 _A_ _B_ _C_ _D_ _E_ _F_ _G_ 1 1 1 2 2 2 3 3 3 5 A 4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 9 9 9 10 10 10 |
[195139] Re[5]: 配列で次元の拡張ができない- ■記事引用/メール受信=OFF■ □投稿者/ 無職勉強中 -(2022/08/26(20:12)) □U R L/ ありがとうございます!! 再度書き直しました。↓ Dim mainbuf As Variant dim cnt as long dim NG as long '一回、mainbufにエクセルに入っている検証対象の値を入れる(すみません、"A10"は可変でないです。ただ、このプログラムを実行する日により"A10000"の可能性もあるので、できるだけ処理に時間がかからないようにしたいです。) mainbuf = Range(Range("A1"), Range("A10")) <A列> おAいしい 楽しい 嫌いB 朝だよAおきろB 笑う 泣Cく AB怒るよC おAいしい 楽しい 嫌いB 'その後、mainbufのそれぞれの配列の中に入っているとあるNGワード(NGワードは"A"、"B"、"C"の3個としますが、実際は1万個くらいあります。プロファニティと言って放送禁止用語みたいなものを想定しています。)があればその横にそのNGワードの列を足していく。 mainbuf(cnt, 1 + NG) = "A" NG = NG + 1 下記の例ですと、最初mainbufはサイズ(10,1) ・・でしたが、 最後にはサイズが(10,4) ・・となります。例えばmsgbox mainbuf(4,3) ⇒ "B"と表示されます。 そして、最終的にrange("A1","D10") = mainbuf ・・と一気にコピペしたいのですが、不可能でしょうか。 もし難しければ、やはりNGワードを直接エクセルのセルに一つ一つ書いていくしかないですかね。。 <A列> <B列> <C列> <D列> おAいしい A 楽しい 嫌いB B 朝だよAおきろB A B 笑う 泣Cく C AB怒るよC A B C おAいしい A 楽しい 嫌いB B この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[195140] Re[6]: 配列で次元の拡張ができない- ■記事引用/メール受信=OFF■ □投稿者/ マナ -(2022/08/26(20:47)) □U R L/ セルへの書き込みはなんとでもなるように思いますが どのNGワードを含むかを調べるのは、できているのですか。 |
[195141] Re[7]: 配列で次元の拡張ができない- ■記事引用/メール受信=OFF■ □投稿者/ マナ -(2022/08/26(21:11)) □U R L/ ↑もし、できていないのであれば、数式でも良ければ、 B列に数式を入れることで、スピルで右方向に抽出できそうな気がします。 |
[195142] Re[8]: 配列で次元の拡張ができない- ■記事引用/メール受信=OFF■ □投稿者/ マナ -(2022/08/26(21:44)) □U R L/ 試してみました。 NGワードは、どこかにリストアップしたうえで、名前定義しておいてください。 =TRANSPOSE(FILTER(ngword,IFERROR(FIND(ngword,A1),FALSE),"")) |
[195143] Re[9]: 配列で次元の拡張ができない- ■記事引用/メール受信=OFF■ □投稿者/ マナ -(2022/08/27(11:17)) □U R L/ こっちのほうがよいかも。 =TRANSPOSE(FILTER(ngword,XLOOKUP("*"&ngword&"*",A1,IF(ngword<>"",TRUE),FALSE,2),"")) |
[195144] Re[10]: 配列で次元の拡張ができない- ■記事引用/メール受信=OFF■ □投稿者/ マナ -(2022/08/27(12:34)) □U R L/ ↑ngwordの範囲に、空白セルがあったときの対策と思ったけど、 試してみたら、対策になっていなかった。 =LET(lst,FILTER(ngword,ngword<>""),TRANSPOSE(FILTER(lst,IFERROR(FIND(lst,A1),FALSE),""))) |
[195145] Re[11]: 配列で次元の拡張ができない- ■記事引用/メール受信=OFF■ □投稿者/ 半平太 -(2022/08/27(16:34)) □U R L/ Sub test() Dim mainBuf() As Variant Dim subBuf() As Variant Dim ngWords As Variant Dim cnt As Long, i As Long, k As Long Dim lastRw As Long, MaxCol As Long Dim t As Date t = Timer ngWords = Range("Z1", Cells(Rows.Count, "Z").End(xlUp)) 'Z列にNGワードがあると仮定 mainBuf = Range("A1", Cells(Rows.Count, "A").End(xlUp)) 'A列の最終入力行までのセル値を格納 lastRw = UBound(mainBuf) MaxCol = 1 ReDim subBuf(1 To lastRw, 1 To MaxCol) For i = 1 To UBound(subBuf) If mainBuf(i, 1) <> "" Then cnt = 0 '初期化 For k = 1 To UBound(ngWords) If ngWords(k, 1) <> "" Then If mainBuf(i, 1) Like "*" & ngWords(k, 1) & "*" Then cnt = cnt + 1 If cnt > MaxCol Then MaxCol = cnt ReDim Preserve subBuf(1 To lastRw, 1 To MaxCol) End If subBuf(i, cnt) = ngWords(k, 1) End If End If Next k End If Next i Range("B1").Resize(lastRw, MaxCol) = subBuf '隣に書き出す MsgBox Format(Timer - t, "0.0") & " 秒 完了" End Sub <結果図> 行 _______A_______ _B_ _C_ _D_ : : _Z_ 1 おAいしい A : : A 2 楽しい : : B 3 嫌いB B : : C 4 朝だよAおきろB A B : : 5 笑う : : 6 泣Cく C : : 7 AB怒るよC A B C : : 8 おAいしい A : : 9 楽しい : : 10 嫌いB B : : |
[195146] Re[12]: 配列で次元の拡張ができない- ■ / 記事引用/メール受信=OFF■ □投稿者/ 無職勉強中 -(2022/08/28(20:08)) □U R L/ ありがとうございます!! 今、拝見いたしました。 あれから一人でやってみたところ、以下の一文(mainbufに一気にrange指定で値をぶっこむ)が問題あるようで mainbuf = Range(Range("A1"), Range("A10")) for文でmainbufの箱一つ一つに値を入れていくようにするとなぜかうまくいきました。 mainbuf(0,0) = range("A1") ただ、結局それもfor文で時間かかるような。。(?) 上記マナさんと半平太さんにいただいた内容についても明日以降試してみます。 まずは、深謝です!! この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[195147] Re[13]: 配列で次元の拡張ができない- ■記事引用/メール受信=OFF■ □投稿者/ 無職勉強中 -(2022/08/28(20:20)) □U R L/ 追伸 すみません、 以下でmainbufを作ると、その後、ReDim Preserve mainbuf・・がエラーが出ず、きちんと機能したという意味です。。 ------------------------------------------------------------------ for文でmainbufの箱一つ一つに値を入れていくようにするとなぜかうまくいきました。 mainbuf(0,0) = range("A1") この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[195148] Re[14]: 配列で次元の拡張ができない- ■記事引用/メール受信=OFF■ □投稿者/ 半平太 -(2022/08/28(21:53)) □U R L/ >mainbufに一気にrange指定で値をぶっこむ)が問題あるようで ふーむ、言っていることがよく分かりませんが、 多分、配列の次元が理解できてないのでは、と思います。 エクセルのシートは2次元になっています(縦と横の構成なので) なので、こう書くとmainbufは2次元の値配列になるのが仕様です。 ↓ mainbuf = Range(Range("A1"), Range("A10")) 1列なのに何故、2次元なんだ? と思うかも知れませんが、 1列が特殊なのであって、一般的には複数x複数の2次元です。 さて、上のmainbufはどんな2次元の要素構成になるかと言えば「縦が1〜10、横が1〜1」になります。 10行x1列なので当然の様に思うかも知れませんが、「添え字が1から始まる」ことは肝に命ずる必要があります。 そんな構造になることについては、プログラマーは手の出しようがありません。仕様なので。 しかし、一般に配列を自分で定義するとき、プログラマーは自由決めることができます。 例えば、Redim mainbuf(10,1) とかです。 そこで注意しなければならないことは、上の定義でどんな配列ができたかと言えば「縦が0〜10、横が0〜1」です。 つまり、Rangeの値をぷっこんだ配列と比較すると、添え字の最小値が1つ小さい(0)から始まっているし、 要素数は、縦横それぞれ1つ多くなっています。 そこが分からないと「問題がありそうだ」なんて感想を持つようになります。 配列を定義する時は、添え字の最小値をチャンと明示する習慣をつけると、そんな思い違いがなくなります。 例えば、Redim mainbuf(0 to 10,0 to 1) とか Redim mainbuf(1 to 10,1 to 1) とか 自分が作りたいのは、どっちなのか、また、RangeのValueをぶっこむとどんな配列にされてしまうのか、 もう一度思い返してみるといいでしょう。 |
[195149] Re[15]: 配列で次元の拡張ができない- ■記事引用/メール受信=OFF■ □投稿者/ 無職勉強中 -(2022/08/29(14:41)) □U R L/ 半平太様 詳しいご説明、ありがとうございます!! 何せ、自宅で独学でして^^;、Redimの使い方や添え字の観念やイレギュラーパターン(?)が詳しく書いてある文献も見つからず、こちらで実際にお伺いしてとても理解できました。 実は以下のもエラー(型が違います)が出て全くわからなかったのですが、 Dim mainbuf() As Variant mainbuf = Sheets("main").Range("A3:A10") 30分試行錯誤して、以下に変えた(valueを付加)ら直りました。。^^; mainbuf = Sheets("main").Range("A3:A10").Value ----------------------------------------------- その後、添え字は0でなく1から始まることもあると伺い、今回は0から始まらないために、「to」を省略せずつける(?)ようで、以下に変えてみたらうまく行きました!!引き続き試してみます。 ReDim Preserve mainbuf(1 To 10, 1 To 2) ※上記だと、行については1つしかない配列を10行目までのに拡大するという意味かと思っていましたが、行の添え字が1から始まって10までの配列にするという意味だというのもわかりました。。 この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[195154] (削除)- ■記事引用/メール受信=OFF■ □投稿者/ / -(2022/08/29(15:57)) □U R L/ この記事は削除されました |
このトピックに書きこむ |
---|