質問: 初歩的な質問で申し訳ありません。 vbaの最終行取得についてご教授宜しくお願い致します。 ワークシー 初歩的な質問で申し訳ありません。 vbaの最終行取得についてご教授宜しくお願い致します。 ワークシートのa1には”製品コード” の文字が入った状態です。 別のブックからデータを取得し、a2に表示させます。 a2のvalueを変数cord1に a2の上4桁を変数cord2に入れるというものなのですが、、、 rc=cells(rows.count,1).end(xlup).row cells(rc +1,”a”).value=8001001 set cord1=cells(rc,”a”) cord2=left(cells(rc,”a”),4) としました。 cord1は8001001 cord2は8001 となって欲しいのですが結果は cord1は”製品コード” cord2は”製品コー” となってしまいました、、、 cells(rc +1,”a”).value=8001001 とした時点で、最終行はa1の”製品コード” からa2の8001001に移っていると思ったのですが、最終行として認識してくれません。 何が問題なのでしょうか、、、 乱文失礼致しました。 どうか、よろしくお願い致します。
回答: こんにちは コードは記述内の制御に従いながら、上から順に実行されてゆきます。 >rc=cells(rows.count,1).end(xlup).row が実行された時点で、最終行(例えば200としておきます。)が変数rcに代入されます。 この時の200はただの数値で、「最終行を示す」とか「セルの位置を表す」といった意味はありません。 これに勝手に意味を付けているのはコードの作成者であって、変数にとってみれば単なる200という数値でしかありません。 「100+100」や「1000/5」の計算結果と、なんら変わるものではないということです。 ですので、 >cells(rc +1,”a”).value=8001001 を実行したからといって、変数rcの内容が変わることはありません。 (変数rcの内容を変更もしていないのに変わってしまうようでは、困る人が続出することと思います) rc+1行目に値をセットした後で、再度 rc=cells(rows.count,1).end(xlup).row を実行してみると、今度は、変数rcには 201 の数値が代入されるはずです。 もしも、機能的に常に最終行を参照できるようなものが欲しいような時は、 function lastrow() lastrow = cells(rows.count, 1).end(xlup).row end function のような関数を別に定義しておいて、変数を使う代わりに cells(lastrow(),1).value といった参照方法をとることで、シートの記入状況に拘わらず、常に(その時点での)最終行の値を参照するコードになります。