電子書籍の厳選無料作品が豊富!

別質問サイトにて 下記のプログラムを教えて頂き、実際に問題無く使用してから、少し勉強しましたが、分からないところがあります。
● D.Cells
の「D」はDimの略ですか?
●R.EntireRow
の「R」はRange の略でしょうか?
そもそもプログラムに略語を使用できるのですか?
● If .Column <> 4 Then Exit Sub
  If .Column = 4 Then Exit Sub ではダメなんでしょうか?
同じ意味のように思えるのですが、成立しない理由を知りたいです。
●End Sub
冒頭がSubから始まり、途中End Sub が挿入されてますが、Subプロシージャが終わっているので、
次は何かしらの Sub から入力が必要なんじゃないかと思いましたが、なぜ必要ないのでしょうか?
●このプログラムはD列に次々と入力し、
 Enterを押したら、同じ行の右隣の空白セルにカットコピーする条件式です。
IF関数は理解しているのですが、
この変数を扱う「Dim」の使用方法がいまいち分からず、どこで空白セルに入力をさせているのか分かりません。

ご教授お願いします。
--------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
'2セル以上なら何もしない
If .CountLarge >= 2 Then Exit Sub
'D列でなければ何もしない
If .Column <> 4 Then Exit Sub
End With

Application.EnableEvents = False

'次の入力対象セルへ値をコピー
Dest(Target).Value = Target.Value

Application.EnableEvents = True
End Sub

'次の入力対象セル
Private Function Dest(ByVal R As Range) As Range
Dim D As Range
Set D = R.EntireRow
Set D = D.Cells(D.Cells.Count).End(xlToLeft)
Set Dest = D.Offset(, 1)
End Function
----------------------------------

A 回答 (6件)

shut0325です。

お礼拝見しました。

>DESTを検索したら、destnationが出てきました。
>使いどころの違いを教えて頂きたいです。

こちらに関する補足ですが、関数名って任意(ただし一部特定の(予約された)ものを除く)ですから、好きなようにつけて良いのです。

そのコードを書いた人がdestnationの省略したものとして命名したかどうかは分かりませんが、そこは深く考えなくていいのかなと思います。

>マクロはきっかけになるボタン操作が必要ですが、VBAは入力した後、条件が揃えば自動的に実行されるのでしょうか?

それなりの基礎知識がいるのですが、マクロとしているものも中身はVBAで記述するサブルーチンと同じで、それをボタン操作やメニューなどから呼び出しているだけです。関数の場合は、セル内で他の関数と同じように「=関数名(引数、、、)」という風に呼び出すことができます。

動作するきっかけとなるものを「イベント」や「トリガ」と言います。
イベントというのは例えば「セルの値が変更されたとき」や「シートを開いた時」など、様々なものが準備されています。

イベント発生時に、条件などを見て、処理をやっていく、、という感じになります。もちろん、イベントが発生した時点で無条件に実行される、、という事も可能です。

これらの処理は「どこにそれを置いておくか」やいつも頻繁に発生するイベントに対して常時動作するようにしていたら、処理が重くなったりする、、などの弊害があります。 先ほどの「セルの値が変更されたとき」なんて常時監視して、それに対してある条件を満たすかどうかの判別処理(無処理も含む)をやっていたらせわしないと思います。

理解を深めるためには、シンプルなコード(サブルーチンや関数)をテスト的に動くように作って動作や仕組みを考えるとよいかと思います。
    • good
    • 0

>変更箇所の変更内容とは値が更新されるという事ですか?


そうです。

>このコードには、セルの数を数える必要があるのですか?
「2セル以上なら何もしない」のためにはセル数を知る必要があります。なぜ「2セル以上なら何もしない」なのかについては仕様を見るか書いた人に尋ねるかしないとわかりません。
    • good
    • 0

>「2セル以上なら何もしない」


>という事らしいですが、日本語に直した動作で言うところのどの部分にあたりますか?
「どの部分」というのがよくわかりませんが...
Worksheet_Changeプロシジャはワークシートが変更されたときに呼び出され、引数Targetに変更箇所が入ります。変更箇所は一つのセルの場合も複数セルの場合もあります。CountLargeでセルの数がわかるので、それが2以上なら何もしないで終了するという意味です。
    • good
    • 0
この回答へのお礼

変更箇所の変更内容とは値が更新されるという事ですか?
このコードには、セルの数を数える必要があるのですか?

お礼日時:2025/01/18 16:35

こんにちは



既に適切な回答がありますが・・

>● D.Cells
>●R.EntireRow
D、R共に変数名です。
作者が自由に設定しているので、AでもBでもhogeでもかまいません。
特に意味はないですが、想像するところRはRangeの1文字目、DはDestinationの1文字目ではないかと思われます。
(何でも良いとはいえ、記憶しやすい命名にするのが普通なので)

>● If .Column <> 4 Then Exit Sub
>  If .Column = 4 Then Exit Sub ではダメなんでしょうか?
意味が全く逆になりますので、ダメですね。
試してみればわかりますが、D列には反応せずにD列以外の入力に反応jするようになります。
「=」で分岐するなら、その後の処理を逆転させる必要があります。

>●End Sub
ご提示のコードは、一つのプロシージャ(=Sub)と一つの関数(=Function)がそれぞれ独立して定義されていると理解してください。
それぞれは
 Private Sub Worksheet_Change()
  ~~~
 End Sub

 Private Function Dest()
  ~~~
 End Function
からなっています。

ご提示の処理に限って言えば、関数Destを独立して定義する必要はないので、Sub Worksheet_Change内に組み込んでひとつのSubとして記述することも可能です。

>●このプログラムはD列に次々と入力し、~~
ご質問文を読む限り、コードの構成や意味をあまり理解なさっていないような印象を受けます。

関数Destは指定されたセルに対して、同じ行の最終列の右隣(=空白セル)を返す関数です。
これを利用して、
 >'次の入力対象セルへ値をコピー
 >Dest(Target).Value = Target.Value
で、空白セルに値をコピーしています。
(ちゃんとコメントに記されていますよね?)

なお、「Dim」は変数を明示的に宣言するためのステートメントです。
https://learn.microsoft.com/ja-jp/office/vba/lan …


※ 多少なりとも理解しているのなら、上に書きましたように関数Destを無くして、一つのSub内に収めるようにコードを書き直してみると、理解をする練習になるかも知れません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ご指摘・質問の通り、私は理解できておりません。
説明も私が依頼したニュアンスをそのまま述べただけです。
動作の部分ではまだ理解できておりません。

>(ちゃんとコメントに記されていますよね?)
コメントとは どこに記入されているのですか?

お礼日時:2025/01/17 16:52

>● D.Cellsの「D」はDimの略ですか?



言え、違います。
Dimというのは変数を定義するものです。
ひとつ前に
Dim D As Range
と宣言していますが、これは D というレンジ型の変数(入れ物みたいなものRange型はどっちかというとクラスのインスタンスぽい?)を準備します、、というような意味です。

その後のD.Cells など、.~~ というのが、メソッド(命令みたいなもの)やプロパティ(パラメーターみたいなもの)を表します。

>●R.EntireRowの「R」はRange の略でしょうか?

これも変数と思って下さい。
Range型の変数です。

→ByVal R As Range
ここで宣言しています。

>そもそもプログラムに略語を使用できるのですか?

省略する(明示しないで良い)というものはあります。
Dimがそうですね。
特に宣言をしない変数はVBAならば、Variant型として扱われます。

他にもif は一行で書くならendif は不要です。

そういったのは随所にあります。

>● If .Column <> 4 Then Exit Sub
  If .Column = 4 Then Exit Sub ではダメなんでしょうか?
同じ意味のように思えるのですが、成立しない理由を知りたいです。

<>4 は 「4以外ならば」 で =4 は 「4ならば」 ですから、全く正反対です。


>●End Sub

今回なら Worksheet_Change()というのが処理そのもので、これで終わりです。

その下に書いてあるのは関数(Function)であり、Worksheet_Changeの中で呼び出されているのがわかるかと思います。

Privateとなっているので、この関数はここ(Worksheet_Changeサブルーティン)内でしか使えません。


>●このプログラムはD列に次々と入力し、~~どこで空白セルに入力をさせているのか分かりません。

その処理を下の方に書いてあるDestという関数で処理しています。

Dest(Target).Value = Target.Value
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
DESTを検索したら、destnationが出てきました。
使いどころの違いを教えて頂きたいです。

また、マクロはきっかけになるボタン操作が必要ですが、
VBAは入力した後、条件が揃えば自動的に実行されるのでしょうか?
ネットに載っているコードを張り付けて閉じても実行されず、躓いている状態です。

お礼日時:2025/01/18 16:32

DとかRは略語ではなく変数名です。


<> 4 は「4ではない」という意味なので = 4 とは逆です。
End SubでWorksheet_Changeプロシジャの定義が終わり、その後にDest関数の定義があります。
Dimは変数の宣言です。Dim D As Range はDがRange変数であるという宣言です。
空白セルに値を入れているのは Dest(Target).Value = Target.Value です。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
変数名 理解しました!

あと、すみません。
教えて頂き、自分なりに構文を理解しようとしたのですが、新たな疑問がわきました。

●With Target
「ターゲットの状態」をあとの構文で示す認識で合ってますか?
この場合、
     If .CountLarge >= 2 Then Exit Sub
はどういう意味なのでしょうか?
「2セル以上なら何もしない」
という事らしいですが、日本語に直した動作で言うところのどの部分にあたりますか?

お礼日時:2025/01/17 17:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A