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


 >この書き方はどちらでも問題ないと思ってよいでしょうか
 arrという変数の宣言方法にも依るかと思います。

 ワークシート上のセル範囲の値を取得する場合は、どちらかと言えば、
 単に  Dim arr (As Variant) と宣言することのほうが多いように思います。
 そのうえで、
 arr = セル範囲
 とか
 arr = セル範囲.Value
 としても全く問題ありません。

 参考記事:
http://officetanaka.net/excel/vba/variable/09.htm
 これは対象がワークシート起源ではないので、幾分ポイントがズレているかもしれませんが。

(xyz) 2026/05/10(日) 15:27:12


 「配列の取り込み」というタイトルからして、
 arrが想定と違っていて、その原因を知りたいという話かと思ったら、
 まるで違う話だったのですか?

       LastRowh = Cells(xlLastRow, 1).End(xlUp).Row
  '    For i = 0 To LastRowh
 の繰り返しが途中で終わってしまう、ということなんですか?
 そう言う話だったら、どうしてその行をコメント扱いにしてしまっているんですかね。
 コメントにしているということは実行に関係ないものだと解釈されるのが普通です。

 私だけではなく、他のかたも同じようにarrの内容を問題としていました。
 普通は、そう受け止めますよ。

 今後は、質問は相手に伝わるように、明確に書いてください。

 また、デバッグということをご自分でしてから、それも踏まえて質問して下さい。
 ・ステップ実行したり、
 ・LastRowhという変数に何がセットされ、それは想定したものかどうか、
 基本的なデバッグの方法をきちんと学習すれば、
 簡単に確認できるはずの話です。
(xyz) 2026/05/11(月) 22:15:28

半平太さま、xyzさま
ありがとうございます
解説いただいてたのに見に来れておらずすみません

いろいろ書いてわかりずらくなって削ったら、違うことになってしまったと思います
配列がわかってないためと思い込んだのもあります。

.Value
エラーになって消した記憶もありますが、どんなエラーだったか、数日たって再開した時には忘れていたりもします。

エクセルの.Value2というのを取得できたりするのかと思ったりしています
すみませんでした
(びき) 2026/05/16(土) 21:09:56


 >すみませんでした

 質問は解決したのですか? (取り下げ?)
 それともまだ続いているのですか?

 ※続いている場合は、論点を再整理していただけませんか?
  何かポイントなのか曖昧で論議しにくいのですが・・

(半平太) 2026/05/16(土) 22:17:00


9日に期待通りの結果になったのですが
書き方気になり、質問書いてしまいました

論点がわからないとのことのお詫びです

ちまちま作業しておりますが、何がわからないかわかれば自分で解決出来そうなきもします
(びき) 2026/05/16(土) 23:13:22


コメント返信:

[ 一覧(最新更新順) ]


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