[[20241130002648]] 『Excelのマクロブックとブックについて。』(コルム) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Excelのマクロブックとブックについて。』(コルム)

「ThisWorkbookでコードを書き、ActiveWorkbookでデータを入れる」とは、マクロが書かれているブック(ThisWorkbook)から、
新しいブック(ActiveWorkbook)を作成し、操作するということを意味します。

具体的な流れ

1. ThisWorkbook(マクロが書かれているブック)にコードを書きます。ここで、新しいブックを作成する処理を記述します。

2. 新しく作成されたブックが自動的にActiveWorkbookとなるため、ActiveWorkbookを使って、その新しいブックにデータを入れたり、セルを操作することができます。の所で、新しいブックを作成する処理を記述する。とは、どういうプログラムでしょうか?教えて頂けると幸いです。

< 使用 Excel:Microsoft365、使用 OS:Windows11 >


 >新しいブックを作成する処理を記述する。とは、どういうプログラムでしょうか?

 これを書くのが普通でしょうね。
    ↓
 Sub test()
     Workbooks.Add
 End Sub

(半平太) 2024/11/30(土) 09:18:27


では、ActiveWorkbook.ActiveSheet.Range(″◯◯″)
 ThisWorkbook.ActiveSheet.Range(″◯◯″)
をそのままプログラム片のコードに記述する事は、できないのでしょうか?教えて頂けると幸いです

(コルム) 2024/11/30(土) 14:02:18


 >そのままプログラム片のコードに記述する事は、できないのでしょうか?

 できますよ。 自分でやってみればいいと思うんですがねぇ・・
    ↓
 Sub test()
     Workbooks.Add
     ActiveWorkbook.ActiveSheet.Range("A1").Value = "コルム1"
     ThisWorkbook.ActiveSheet.Range("B1").Value = "コルム2"
 End Sub

 どんな結果になるか、ご自分で確かめてください。

(半平太) 2024/11/30(土) 14:12:09


Sub test02()
    ThisWorkbook.ActiveSheet.Range("A2").Value = "ThisWorkbook"
    Workbooks.Add
    ActiveWorkbook.ActiveSheet.Range("B2").Value = "ActiveWorkbook"
    ThisWorkbook.ActiveSheet.Range("A3").Value = "ThisWorkbook"
    ThisWorkbook.Activate
    ActiveWorkbook.ActiveSheet.Range("C3").Value = "ActiveWorkbook"
End Sub

どっちのブックに文字が入力されるか確認してみてください。

そもそも、「ブックがアクティブになる」という状況が理解できてないってことですか?
ブックが複数開いていたら、どのブックがアクティブ(手動で操作可能な状態)なのか
分からなくなりやすいです。
(まっつわん) 2024/11/30(土) 19:50:32


 変数にすると

 Sub testVariables()
     Dim ThisWB As Workbook, NewWB As Workbook
     Set ThisWB = ThisWorkbook
     Set NewWB = Workbooks.Add
     MsgBox ThisWB.ActiveSheet.Name, , "コードが書かれたブック"
     MsgBox NewWB.ActiveSheet.Name, , "新規ワークブック"
 End Sub
(jindon) 2024/11/30(土) 21:46:19

みなさんすみません。やはり、Valueを付けないとだめでしょうか?教えて頂けると幸いです。本当にそのまま使って欲しいのですが。Value抜きで回答していただけると幸いです。やはり、Valueは必須なのでしょうか?
(コルム) 2024/12/05(木) 06:01:28

 急に話題を変えてないですか? 
 これまでのやり取りで何か分かったんですか?

 少なくとも「よく分からないので質問を変えます」
 とか言って区切りを付けてくださいよ。

 「Value抜きで」とは
 1.Rangeオブジェクトの使い方の話なんですか?
 2.RangeオブジェクトのValueプロパティの使い方の話なんですか?

 いずれにして、状況次第なので、
 どんな使い方をしたくてこの質問をしたのか、それを説明してください。

(半平太) 2024/12/05(木) 07:54:02


 >やはり、Valueを付けないとだめでしょうか?教えて頂けると幸いです。

自分で消してみたらどうなるのか、試してみてはいかがでしょうか?
いちいち聞くのは時間がもったいないです。

Valueってつけなくてもいいの?>>
http://officetanaka.net/excel/vba/beginner/08.htm

Rangeオブジェクト.Valueの省略について>>
https://excel-ubara.com/excelvba4/EXCEL246.html

標準のプロパティ>>
http://officetanaka.net/excel/vba/speed/s8.htm

オブジェクトには、標準のプロパティ(既定のプロパティ)というのがあって、
その既定のプロパティの記述の省略が許されています。書かない(=省略する)でもいいですが、
どのプロパティを設定(または取得)しているのかは常に意識する必要があります。

(※その参考書(?)ちょっとまずそうなので、他のに変えた方がよいかと。。。)

VBA用語集!VBAをはじめるならまずは覚えたい基本用語28選>>
https://exceljoshi.cocoo.co.jp/media/excel-vba-words

VBAを覚えるなら、まずは
この辺の用語は、しっかり理解しておく必要があります。
(用語をすっ飛ばしてサンプル集から始めて苦労した経験あり。)
(まっつわん) 2024/12/05(木) 08:30:17


 うーむ、「書かないでいい」なんて表現は誤解の元ではないかな?
 状況次第としか言いようがないハズなのだが。

 その状況にしても、一般ユーザーはよく分かっていない。経験で補っているだけ。
 tanakaさんも神髄さんもそのレベルでしかない。

 Valueプロパティのプログラムを見たことがないんだからしょうがない。
 それを処理している各オブジェクトに関しても同じことが言える。

(半平太) 2024/12/05(木) 09:14:48


>tanakaさんも神髄さんもそのレベルでしかない。
そういうあなたもその一人ですか。
(わらわせるね) 2024/12/05(木) 09:24:32

みんな付けてるから、俺もつけるようにしようでもいいかと
それなりに理解が進めば(すすむのか?)、この場合はこれってなるかも?(なるのか?)
(なるへそ) 2024/12/05(木) 11:43:16

 >Value抜きで回答していただけると幸いです。

あぁ、そうか。見ている参考書には書いてないから、
知らない単語が増えたらパニックになるってことかなぁ。。。

えっと、「セルは値を入れる箱みたいなもの」という認識なのかなぁ。。。?
例えば、セルと、単に表現した時、
そのセルというものは、情報の塊的なイメージをしてみてください。
「セルに値を入れた」、この時は「A1」セルのValueという引き出しに
値をセットしたことになります。
「セルに数式を入れた」、この時はセルのFormulaプロパティに数式をセットして、
Valueプロパティに数式の答えがセットされます。
この辺の挙動はエクセル君が忖度して変換してくれるので、
普段あまり意識してないかも知れません。
セルの書式設定で表示形式を変えていたら、
Textプロパティに表示されている文字が入ります。
その他、塗りつぶしやフォント、罫線など様々な情報で構成されたものが、
「セル」というものになります。

なので、セルに値をセットしたいなら、
Range("A1") = "文字列"
と書いてもいいですが、セル「A1」のどの情報をセットしたいのか、
他の人にとっては(数か月後の自分も含む)、コードを書いた人の意図が明確ではないと私は思います。
Range("A1").Value = "文字列"
(日本語訳すると、セル「A1」の値に「"文字列"」)
と私なら書きます。
いま、本題と関係なく理解の邪魔になるなら、
とりあえず、サンプルコードからValueは消してください。

(まっつわん) 2024/12/05(木) 13:04:01


コルム君は Excel VBA の前に日本語を勉強したほうがいい。

(口戯積分) 2024/12/05(木) 15:13:51


そーいえば、、、、

一部書き込みに間違いがあったので訂正します。

Rangeオブジェクト(セル範囲)の既定のプロパティはCellsプロパティでした。
なので、Valueプロパティを省略してよいということにはならないです。
ですが、実際にValueプロパティを省略してもエクセル君が忖度してくれる場合が、
実際あるようです。
ですが、エクセル君に仕事を頼む文章がマクロのコードなので、
エクセル君にコードを書く人の意図が間違いなく伝わる
文章を書く必要があるかと思います。
(上手く伝わらなかったらエラーになったり、間違った結果が出ることになります。)
なので、Valueプロパティを明記することをお勧めします。
(まっつわん) 2024/12/20(金) 19:35:52


 【余談的、末梢的な話で恐縮です。時間の無い方はスキップください。】

 > Rangeオブジェクト(セル範囲)の既定のプロパティはCellsプロパティでした。

 余り生産的な話じゃないですけど(つまり、知っていてなんなのかという議論ですが(私見))、
 一応コメントしておきます。

 【Excel VBA】Rangeオブジェクトの既定のプロパティ…_Defaultプロパティ
https://officek.net/excelvba/v-range/vr-range/vrr-default/
 が参考になるでしょう。

 感想です。
 Valueを付けるべきかどうかは、ご指摘のとおり、個別的なものであって
 論理で詰め切れるものではないです。余り突き詰めようとしても無益です。
 アプリケーションのプログラム自体がそんなに論理で決まっているものではないです。
 概ねValueを付けることが推奨されますが、付けないこともあります。
 付けないで痛い目に合うこともあります。
 そういうものだと思って、むしろ
 <<コードで何を実現するか>>という本来の方向に重点を置いて進まれたほうが
 きっと良いことがあると思います。
(xyz) 2024/12/20(金) 20:54:32

 フーム、
 Rangeオブジェクトの既定のプロパティについては過去しつこく論議したことがありますが、
 流石にCellsプロパティと言った人は居なかったなぁ。

 その時の私の結論は「誰も分かっていない」です。
 まぁ、MS社がプロパティの仕様書なんかを一般ユーザーに見せてくれることはないでしょうからねぇ。
 外野はあれこれ実験をして、仕様を逆算するくらいしかできない。OfficeTanakaさんだって同じです。

 紹介のあった、きたみあきこさんでも、_Defaultプロパティが既定と言うのは正しいでしょうが、
 ._Default が何をするプロパティ(プログラム)なのかは分かっていない。
 簡単な実験で、こう結論しているだけです。

  >_Defaultプロパティは、引数を指定しない場合はValueプロパティ、
  >引数を指定する場合はItemプロパティと同様の処理を行います。
  >そのため、ValueプロパティとItemプロパティの2つが既定のプロパティのような挙動をするのです。

 そんな実験でよければ、Valueではなく、Formulaだとも言えちゃいます。

 また、以下の実験をすると、Valueと同様と言うのは憚れる。※1行目と同じことをするにはValueは不可欠。
  x = Range("A1").Value(11)
  y = Range("A1")(11)

 上の実験では、何気なく等号の右辺に持ってきていますが、
 そもそも、等号の左辺の話なのか、右辺の話なのかを分けないで話をしている人も少なくない、
 値を設定するのか、取得するのかは別の処理であり、
 プロパティ名は同じでも別のプログラムであることが分かっていない。(プログラムであることさえ知らない人も居る)

 おおよそ以下の5パターンで考える(実験する?)必要があると思っています。
  Range=値
  Range=Range
  Range=Range以外のオブジェクト
  Range以外のオブジェクト=Range
  変数=Range

(半平太) 2024/12/21(土) 11:01:43


コメント返信:

[ 一覧(最新更新順) ]


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