[[20250313092858]] 『配列の要素が1つの場合』(ウメ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『配列の要素が1つの場合』(ウメ)

G列の日付に+3した値をB列に表示するマクロを組んでいます
一度だけ使用する表ではなく記録が続くのですが
記録する行が1つだと型が一致しません
9行目の〇印 For i = LBound(MyArr1, 1) To UBound(MyArr1, 1) 
でエラーになってしまいます
2行以上あれば問題なくできます
調べたのですが原因が分かりません、、、

    Dim MyArr1 As Variant
    Dim rngTop As Range
    Dim rngBottom As Range
    Dim i As Long
    Dim lastRow As Long
      lastRow = Ws.Cells(Rows.Count, 7).End(xlUp).Row
      Set rngTop = Ws.Range("G5")
      Set rngBottom = Ws.Cells(lastRow, 7)

      MyArr1 = Ws.Range(rngTop, rngBottom).Value

     〇For i = LBound(MyArr1, 1) To UBound(MyArr1, 1)
          MyArr1(i, 1) = MyArr1(i, 1) + 3
      Next i

      Ws.Range(rngTop, rngBottom).Offset(, -5).Value = MyArr1

 A  B  C  F  E  F  G  ・
1 
2  見出し      
3   ・
4   ・
5  ( )            3/13   

自分だけ使用するのであれば関数で解決なのですが
複数人使用し
また、このブック自体をコピーし項目ごとに使いまわすため
マクロで解決したいと考えています
初心者なので修正する部分や別案がありましたらご教示いただけますと幸いです           

< 使用 Excel:unknown、使用 OS:unknown >


< 使用 Excel:Excel2019、使用 OS:Windows10 >

(ウメ) 2025/03/13(木) 10:38:43


きっと 配列になっていない。。。かも^^;
行番号とかセル数なんかを使い、条件文で強制的に配列にしてしまえばいいかも。。。←多分ですが。。。(*^^*)

他の有識者様の回答をお待ちくださいませ。。。m(__)m

(隠居Z) 2025/03/13(木) 10:48:19


私も隠居Zさんと同意見で、8行目のMyArr1 = Ws.Range(rngTop, rngBottom).Valueが一行のみだと配列になっていないからだと思います
8行目のmyArr1=・・・以降の提案として

for i=5 to lastRow

 Ws.Cells(i,"A").Value=Ws.Cells(i,"G").Value + 3
next i

でいかがでしょうか
(ささみ) 2025/03/13(木) 11:10:04


あっすみません表示するのはB列でしたね

 Ws.Cells(i,"B").Value=Ws.Cells(i,"G").Value + 3

でよろしくお願いします
(ささみ) 2025/03/13(木) 11:13:05


隠居Z 様
ささみ 様

ありがとうございます
根本の理解ができていませんでした
1つだと配列にならないのですね、、、

ささみ様

ご教示いただいたマクロで出来ました
ありがとうございます
(ウメ) 2025/03/13(木) 11:27:46


 考え方の一つですが、最終行を1つ増やせば

 Sub sample()
    Dim MyArr1 As Variant
    Dim rngTop As Range
    Dim rngBottom As Range
    Dim i As Long
    Dim lastRow As Long
    Set ws = ActiveSheet
    lastRow = ws.Cells(Rows.Count, 7).End(xlUp).Row
    Set rngTop = ws.Range("G5")
    Set rngBottom = ws.Cells(lastRow, 7)
    MyArr1 = ws.Range(rngTop, rngBottom.Offset(1)).Value
                                           '↑ここ
    For i = LBound(MyArr1, 1) To UBound(MyArr1, 1)
         MyArr1(i, 1) = MyArr1(i, 1) + 3
    Next i
    ws.Range(rngTop, rngBottom).Offset(, -5).Value = MyArr1
 End Sub
(´・ω・`) 2025/03/13(木) 11:36:28

 セル1つの場合はValueは配列にならないのでセル数に応じて場合分けすればいいでしょう。

 Sub sample()
    Dim MyArr1() As Variant
    Dim sRng As Range
    Dim i As Long
    Set ws = ActiveSheet
    Set sRng = ws.Range("G5", ws.Cells(Rows.Count, 7).End(xlUp))
    If sRng.Count = 1 Then
        sRng.Offset(, -5).Value = sRng.Value + 3
    Else
        MyArr1 = sRng.Value
        For i = LBound(MyArr1, 1) To UBound(MyArr1, 1)
             MyArr1(i, 1) = MyArr1(i, 1) + 3
        Next i
        sRng.Offset(, -5).Value = MyArr1
    End If
 End Sub

(hatena) 2025/03/13(木) 12:07:15


 > 自分だけ使用するのであれば関数で解決なのですが
 > 複数人使用し
 > また、このブック自体をコピーし項目ごとに使いまわすため
 > マクロで解決したいと考えています
 > 初心者なので修正する部分や別案がありましたらご教示いただけますと幸いです  

 別案ですが、マクロで式を設定して値に変換すればシンプルに実現できます。

 Sub sample2()
    With Range("G5", Cells(Rows.Count, "G").End(xlUp)).Offset(, -5)
        .Value = "=G5+3"
        .Value = .Value
    End With
 End Sub

(hatena) 2025/03/13(木) 12:16:31


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.