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

    [191991] 配列が出力できない他-

    ■親トピック/記事引用/メール受信=OFF■

    □投稿者/ ワスントン -(2020/05/16(09:13))
    □U R L/
      お世話になっております。
      以下配列の出力ができません。
      ループ内で処理したら出力できるのですが、
      ループ外だと出力できなくなります。
      何が原因なのか全くわかりません。
      原因を知りたいので、ご教授願います。
      
      Sub 転記4()
          With ThisWorkbook
              Set ws1 = .Worksheets("sheet1")
              Set ws2 = .Worksheets("sheet2")
          End With
          ws2.Cells.Delete
          With ws1
              LRow = .UsedRange.Rows.Count
              For i = 2 To LRow
                  If .Cells(1, 4).Value = .Cells(i, 1).Value Then
                      k = k + 1
                      For j = 1 To 2
                          ReDim TDataa(k, j)
                          TDataa(k, j) = .Cells(i, j).Value
                          ‘ws2.Cells(k, j).Value = TDataa(k, j) @ここに配置すると出力できる
                      Next j
                  End If
              Next i
              Dim ArrRow As Long
              Dim ArrCol As Long
              
              ArrRow = UBound(TDataa, 1) - LBound(TDataa, 1)
              ArrCol = UBound(TDataa, 2) - LBound(TDataa, 2)
              
              MsgBox "一次元" & ArrRow & "データ" & vbCrLf & _
              "二次元" & ArrCol & "データ"
             ‘ws2.Cells(1, 1).Resize(ArrRow, ArrCol) = TDataa 'Aここに配置すると出力できない
              
          End With: k = 0
          
      End Sub
      
      excel365 win10


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

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



      ++++++++++++++++++++
      OS      ⇒OTHER
      Version⇒OTHER
      ++++++++++++++++++++




    [191992] Re[1]: 配列が出力できない他-

    記事引用/メール受信=OFF■

    □投稿者/ γ -(2020/05/16(10:14))
    □U R L/
      1.動的配列は、最後の次元に沿ってしか拡張できません。
      2.また、拡張する際にも、Preserveを付けないと、前のデータは消去される仕組みです。
      仕様がわからないので、改善案は示せませんが、上記二点に気を付けて
      修正してみてください。
      
      




    [191993] Re[2]: 配列が出力できない他-

    解決!!ありがとうございました! / 記事引用/メール受信=OFF■

    □投稿者/ ワスントン -(2020/05/16(11:08))
    □U R L/

      γ様
      ありがとうございます。

      教えていただいた内容に気を付け
      再度トライしてみます。




    [191994] Re[2]: 配列が出力できない他-

    記事引用/メール受信=OFF■

    □投稿者/ γ -(2020/05/16(11:11))
    □U R L/
      (1)ひとつずつ大きさを増やしていくなら、行と列を逆にした配列を作り、
         列方向にデータを増やしていくことになります。
         Redim Preserve の形でRedimすることに注意。
        最後にそれを Application.Transposeで逆転して、ワークシートに書き込みます。
      
      (2)別の方法として、元と同じ大きさの二次元配列を最初にRedim宣言しておき、
         実際に書き込んだ行数(つまり、k)を利用して
         ワークシートに書き込みます。
             ws2.Cells(1, 1).Resize(k, 2) = Tdataa
         この場合、配列のほうが大きさが大きくてもエラーにはなりません。
         左辺で指定した領域だけにデータが書き込まれます。   
      




    [191995] Re[3]: 配列が出力できない他-

    記事引用/メール受信=OFF■

    □投稿者/ マナ -(2020/05/16(11:27))
    □U R L/

      お邪魔します、

      >1.動的配列は、最後の次元に沿ってしか拡張できません。
      >2.また、拡張する際にも、Preserveを付けないと、前のデータは消去される仕組みです。

      1と2の説明順番を、逆のほうが、誤解を与えないかもしれません。
      質問者さんは、コード修正の過程で、正しく理解されるは思いますが。





    [191997] Re[4]: 配列が出力できない他-

    記事引用/メール受信=OFF■

    □投稿者/ γ -(2020/05/16(14:45))
    □U R L/
      ご指摘ありがとうございました。
      そうだったですね。
      >キーワード Preserve を指定した場合、
      >変更できるのは、動的配列の最後の次元のサイズに限られます。
      
      
      たぶんこういう仕様かと想定してコードを書いてみました。
      test1は一行ごとにRedimする方式、
      test2は最初に一度だけRedimする方式です。
      参考にしてください。
      
      Sub test1()
          Dim ws1 As Worksheet, ws2 As Worksheet
          Dim LRow As Long
          Dim i As Long, j As Long, k As Long
          Dim Tdataa()
          
          With ThisWorkbook
              Set ws1 = .Worksheets("sheet1")
              Set ws2 = .Worksheets("sheet2")
          End With
          ws2.Cells.ClearContents
          
          With ws1
              LRow = .UsedRange.Rows.count
              For i = 2 To LRow
                  If .Cells(1, 4).Value = .Cells(i, 1).Value Then
                      k = k + 1
                      ReDim Preserve Tdataa(1 To 2, 1 To k)
                      For j = 1 To 2
                          Tdataa(j, k) = .Cells(i, j).Value
                      Next j
                  End If
              Next i
              Dim ArrRow As Long
              Dim ArrCol As Long
      
              ArrRow = UBound(Tdataa, 1)
              ArrCol = UBound(Tdataa, 2)
      
              ws2.Cells(1, 1).Resize(ArrCol, ArrRow) = Application.Transpose(Tdataa)
          End With
      End Sub
      
      Sub test2()
          Dim ws1 As Worksheet, ws2 As Worksheet
          Dim LRow As Long
          Dim i As Long, j As Long, k As Long
          Dim Tdataa()
          
          With ThisWorkbook
              Set ws1 = .Worksheets("sheet1")
              Set ws2 = .Worksheets("sheet2")
          End With
          ws2.Cells.ClearContents
          
          With ws1
              LRow = .Cells(Rows.count, "A").End(xlUp).Row
              ReDim Tdataa(1 To LRow, 1 To 2)
              For i = 2 To LRow
                  If .Cells(i, 1).Value = .Cells(1, 4).Value Then
                      k = k + 1
                      For j = 1 To 2
                          Tdataa(k, j) = .Cells(i, j).Value
                      Next j
                  End If
              Next i
              ws2.Cells(1, 1).Resize(k, 2) = Tdataa
          End With
      End Sub
      


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

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



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

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

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


- Child Forum -
Edit:ゆう-G