『配列への取り込み』(びき)
お世話になります
セル範囲を配列に取り込んで処理しコピーシート名前を付ける処理をしたく下記のように取り込みしていますが、結果が違うので、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
>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
最終行は同じはずですが、確認します
またいきづまりましたら、お伺いします
(びき) 2026/05/09(土) 14:20:51
急ぎませんが、結果を知らせて下さい。 (xyz) 2026/05/09(土) 14:26:02
>明細の最終行が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
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.