🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

807閲覧

vbaでrange指定の簡略化が知りたいです。

pe_san

総合スコア4

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2023/04/17 01:42

編集2023/04/17 02:08

前提

仮定として、
・ブックに3つのシートがある。
・シート1にあるコマンドボタンをクリックすることで、シート2の「A3セルから、入力されている一番下までのセル」を範囲コピーする。
ことにします。

実現したいこと

詳細は下記「該当のソースコード」に記述しますが、他のシートのセルを参照しないように「worksheets(2)」を計3回記述しているのですが、必要のない場所があるのなら削りたいと考えています。

該当のソースコード

Private Sub CommandButton1_Click() Worksheets(2).Range(Worksheets(2).Range("a3"), _ Worksheets(2).Range("a3").End(xlDown)).Copy End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2023/04/17 02:02

タイトルに入ってる機能名 スペル間違ってます(細かいですがとても大事なことです)
pe_san

2023/04/17 02:03

質問ありがとうございます。 知識が無く申し訳ないのですが、元々1文のステートメントをwithステートメントに変換するメリットはあるのでしょうか? withステートメントは複数のステートメントの重複している部分をまとめるものだと認識していました。
pe_san

2023/04/17 02:06

タイトル renge → range です。 ご指摘ありがとうございます。
pig_vba

2023/04/17 03:13 編集

BA済みですが一応別方向のアプローチとしてコメント。将来的にどっちも知ってて損はないと思いますので 今回のような状況であればrange自体を変数化することでも簡略化可能です(宣言行は増えますが、連続でない複数個所で呼び出す場面ならWithより使いやすいです)。 ------------------------------------- dim rng as Range set rng= Worksheets(2).Range("A3") Range(rng, rng.End(xlDown)).Copy
pe_san

2023/04/17 06:16

変数化は思いつきませんでした。 確かに宣言行は増えますが、ステートメント自体は1行でまとまっているのですごく見やすいです。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2023/04/17 06:48

一応ちゃんと言っておくと、こういうのは他人に聞くような質問じゃない。 JavaScriptでletとconstとvarを初めて見た!って言ってるようなものです。 体系的な資料に1度も目を通さずに他人に聞くのは止めましょう。 まあ今更VBAを始めてるって時点でアレですが。。。
pe_san

2023/04/17 23:47

自分にはJavaScriptについての知識が無いのでconst、varがそもそも何かは知らないですが、 今更vbaを始めることはおかしいのでしょうか?
退会済みユーザー

退会済みユーザー

2023/04/18 00:04

VB6という古い言語のサブセットなので最近の言語と比較すると使いにくく、VBA自体あまり触りたがられない言語というのが実情だと思います。 担当になりたくなくて出来ることを隠してる人がいるくらい。 長いのを書くと差分比較やバージョン管理が簡単に出来ず、環境構築どうしようか悩んだりします。 逆にそこを狙いたいならどうぞ。 そういう意味ではCOBOLとかさらに忌避されていますので、検討の余地ありかもですよ。
pe_san

2023/04/18 00:22

「メジャーな言語ではない」くらいにしか認識していませんでしたが、そこまで忌避されているのは初めて知りました。 別の言語を勉強する機会があれば、差分比較/バージョン管理等にも着目して決めたいと思います。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2023/04/18 00:41

「そこ」というのは「差分比較/バージョン管理」ではありません。 忌避されているという点ですよ。「差分比較/バージョン管理」なら海外のツールがあるにはありますが、VBAごときのために外部コードをプロジェクトに入れるのは悩ましいという話です(オレオレツールを入れるのは論外)。 COBOLerになると喜ばれますよ。
pig_vba

2023/04/18 04:59

そもそもVBAを自分の定例業務の効率化や自動化で楽するため以外の目的で学んでいる人がそんなにいるかという話ですけどね それで食っていくっていうなら(保守のしにくさの問題で)忌避されやすい言語でしょうけど今より一時間サボるために学ぶ程度なら今でもよくある話でしょう?
退会済みユーザー

退会済みユーザー

2023/04/18 05:17

いや片手間に延々とメンテさせられる未来があってですね・・・それがコレもコレもと増えるんですよ
guest

回答2

0

ベストアンサー

withステートメントのサンプルです。

With Worksheets(2) .Range(.Range("a3"), .Range("a3").End(xlDown)).Copy End With

Worksheets(2)でくくりRangeの前にピリオド(.)のみ指定します。

投稿2023/04/17 02:50

zero.lay

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pe_san

2023/04/17 02:58

一つのステートメントで複数の対象をくくることが出来るのは初めて知りました。 ありがとうござました。
guest

0

Worksheets(2).Range("a3", Worksheets(2).Range("a3").End(xlDown)).Copy

worksheetsオブジェクトを1個に短縮は出来ないみたいでした。
質問、ご指摘ありがとうございました。

withステートメントでの短縮についてはこれから調べてみます。

投稿2023/04/17 02:41

pe_san

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問