[[20260509114620]] 『配列への取り込み』(びき) ページの最後に飛ぶ

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

| 全文検索 | 過去ログ ]

 

『配列への取り込み』(びき)

お世話になります
セル範囲を配列に取り込んで処理しコピーシート名前を付ける処理をしたく下記のように取り込みしていますが、結果が違うので、arrの書き方など調べているところです。なにかアドバイスいただければありがたく存じます
Dim arr() As Variant
Set 明細 = ThisWorkbook.Worksheets("明細")

    With 明細
      xlLastRow = Cells(Rows.Count, 1).Row  'Excelの最終行
       LastRowh = Cells(xlLastRow, 1).End(xlUp).Row
 '    For i = 0 To LastRowh
    arr = .Range(.Cells(xlLastRow, 1).End(xlUp), .Cells(1, 19))
    Sn = arr(2, 1)

End With

2010でも使用

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


 > 結果が違う
 どのように違うか説明して下さい。
 エラーが出るなら、
 ・どの行でエラーが発生するのか
 ・エラーメッセージは何か(省略せずに書いて下さい)

 エラーは出ないが想定と違うなら、
 想定は何で、しかし実際はこんなことになってしまう
 という説明をしてください。

 # 想像はつきますけど、きちんとした説明が欲しいところです。
(xyz) 2026/05/09(土) 12:53:19

>結果が違うので
どのような結果を想定して
どのような結果が返ってきているのですか?

サンプルを作ってみましたが、
私は、私の想定した通りの結果が返ってきています。
(匿名) 2026/05/09(土) 12:56:23


エラーメッセージはないです

明細の最終行が75まであっても35から40行で終わる
たまに最終まで処理できることがあります

 arr = .Range(.Cells(xlLastRow, 1).End(xlUp), .Cells(1, 19))
レンジ範囲の書き方がおかしいのかと思いました
.valueの有無とか

LastRowh = Cells(xlLastRow, 1).End(xlUp).Row取得して、
arr に取り込み方がいいのかとか考えたのです

(びき) 2026/05/09(土) 13:41:03


AIに聞いてみたら
範囲の方向についてこんなことを教えてもらいましたがこの情報はあっていますでしょうか?
.Range(開始セル, 終了セル) は開始セルが左上、終了セルが右下でなくてもOKですが、逆順だと選択範囲が意図と異なる場合があります。
必要に応じて .Range(ws.Cells(1, 1), ws.Cells(lastRow, 19)) のように並び替えると安全です。
(びき) 2026/05/09(土) 13:53:08

 >arr = .Range(.Cells(xlLastRow, 1).End(xlUp), .Cells(1, 19))
 >レンジ範囲の書き方がおかしいのかと思いました

 想定と違う結果になったときに、
 .Cells(xlLastRow, 1).End(xlUp).Addressなどを調べて、
 データがある最終行になっているかを確認することです。

 各列でデータがある最終行が同じであれば、A列で代表させるのは適切です。
 違う場合に、単にA列だけを見ていると異なることになります。

 最終行が各列で違う場合に、それらの最大値を求めるには、検索を使った方法があります。
 Columns("A:S").Find("*", , xlValues, xlPart, xlByRows , xlPrevious).Row
 とするとよいでしょう。
(xyz) 2026/05/09(土) 14:08:54

xyz様
ありがとうございました

最終行は同じはずですが、確認します

またいきづまりましたら、お伺いします
(びき) 2026/05/09(土) 14:20:51


 急ぎませんが、結果を知らせて下さい。
(xyz) 2026/05/09(土) 14:26:02

質問文のコード内の
.Cells(xlLastRow, 1).End(xlUp)
というのは、Excel2019なら
.Cells(1048576, 1).End(xlUp)
となり、1048576行目から上方向に向かって進み、最初にデータが存在するセルのことです。
A1048576セルを選択し、Ctrl+↑キーを押すのと同じです。

>明細の最終行が75まであっても35から40行で終わる
上記が事実ならA列の75行目にデータは存在せず、ようやく40行目にデータがあった、
ということになりませんか。
「最終行は同じはず」が事実であるなら、見えているコードだけではありえませんが、
変数 xlLastRow に35とか40が代入されているとか。

xyzさんの回答にあるコードを試されるのが解決の早道でしょう。

追記 21:05
「見えているコードだけではありえませんが」は誤りです。
お詫びして訂正いたします。
(´・ω・`)さんの回答の通り、
明細シート以外のシートがアクティブな状態でコードを実行した場合、
想定外の値が代入される可能性があります。

(くま) 2026/05/09(土) 16:58:34


      xlLastRow = Cells(Rows.Count, 1).Row  'Excelの最終行
      LastRowh = Cells(xlLastRow, 1).End(xlUp).Row

 これはアクティブシートを対象にしています。
 明細シートを対象にするなら

      xlLastRow = .Cells(Rows.Count, 1).Row  'Excelの最終行
      LastRowh =  .Cells(xlLastRow, 1).End(xlUp).Row
         ↑この . が大事 
(´・ω・`) 2026/05/09(土) 18:34:45

ありがとうございました
何年後かに見てわかりやすいほうがよさそうと思い
下のように書き換えて、最終行まで処理でき何度実行しても同じ結果となりました。
    With 明細
       xlLastRow = .Cells(Rows.Count, 1).Row  'Excelの最終行
       LastRowh = .Cells(xlLastRow, 1).End(xlUp).Row
       arr() = .Range(.Cells(1, 1), .Cells(LastRowh, 19)).Value

(xyz)様
ありがとうございます。
arrの中を確認しようとしてたのですが範囲もですね

19列目は1列目と同数行で、他の行には、最後が空白のところもありました。

(´・ω・`)様
「.」 が大事なんですね 違いを気にしておりませんでした
ありがとうございます

くま様

 xlLastRow = Cells(Rows.Count, 1).Row  'Excelのバージョンが違ってもEnd(xlUp).Rowで同じ結果のはずと思ってました
(びき) 2026/05/09(土) 21:34:21

複数シートがありますので、明細シートを選択して、実行していた時には期待通りできてたということですね。
たいていはシート1を選択していました。
お世話になりありがとうございました

arr() = .Range(.Cells(1, 1), .Cells(LastRowh, 19)).Value
arr = .Range(.Cells(1, 1), .Cells(LastRowh, 19))

この書き方はどちらでも問題ないと思ってよいでしょうか
(びき) 2026/05/09(土) 21:45:41


 >arr() = .Range(.Cells(1, 1), .Cells(LastRowh, 19)).Value
 >arr = .Range(.Cells(1, 1), .Cells(LastRowh, 19))
 >この書き方はどちらでも問題ないと思ってよいでしょうか

 質問のポイントが今一つ分からないのですが、
 そもそも、2つ目は「型不一致エラー」になりませんでしたか? 
 私はエラーになりましたけど。
 ※arrは配列変数として定義されている、と言う前提ですよね?

 あと、ちょっと気になったのですが、
 これって無意味なことやってないですか?
        ↓
 >xlLastRow = Cells(Rows.Count, 1).Row  'Excelの最終行
  xlLastRow = Rows.Count でいいハズですから。

(半平太) 2026/05/10(日) 12:59:30


コメント返信:

[ 一覧(最新更新順) ]


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