戻る  □一般操作のサロン  □ 使用方法  □ 新着記事  □ 新規に質問する!  □ トピック一覧  □ 検索  □ 過去ログ
[ 最新記事及び返信フォームをトピックトップへ ]
このトピック参照回数 :
配列で次元の拡張ができない

    [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               
      


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他




    [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              :  :  


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他




    [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をぶっこむとどんな配列にされてしまうのか、
      もう一度思い返してみるといいでしょう。


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他




    [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/

      この記事は削除されました



このトピック内容の全ページ数 / [0]

このトピックに書きこむ
Name/
E-Mail/

└>このツリーのレス記事をメールで受信しますか? YES/ NO/
Title/
URL/
Comment/ 通常モード->  図表モード-> (←の場合適当に改行を入れて下さい)
タグが使用できます。例 ⇒ <font color="blue">文字</font>
解決!!ありがとうございました! 解決       保留中です・・・ 保留        迷宮入りorほかあたって見ます・・ 迷宮入       すいませ〜ん。誰か〜! Help! ←※回答者専用
解決したらチェック       保留(コードテスト中など・・)         解決不可orレスが全く付かなくてほかのサイトに行くときなど・・
削除キー/
(半角8文字以内) 


- Child Forum -
Edit:ゆう-G