このようなステートメントがたくさんあります。
これはいったい何をしているのでしょうか?
Property Get と Property Setについても同様に分りません。
どなたか教えていただけないでしょうか。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

理解困難ですか?



些細な事でも、わからなかったら遠慮なく聞いてくださいね。

Property関係を熟知するVBプログラマは、ぼくの周りにも少ないです。
流れがわかっていても、どうやったら効果的/有効的になるかがわかってないのです。だから、そういう人はPropertyを使用しようともしません。
むやみやたらにPropertyを使用するのはお奨めしないけど、たくさんのサンプルプログラムを作成し、慣れない関数を多用し、研究する努力が必要だと思います。
Propertyを使用しなくても済む部分をPropertyを使用してみるとかするのもいいと思います。
作成した後、本当にPropertyは必要なのか、Propertyを使用することによって、プログラミング的に効果的であったかなどの検証をして学ぶと、より早く身に着くと思います。


むずかしい分野ですが、がんばってくださいね。
    • good
    • 1
この回答へのお礼

大変ありがとうございます。
Getに関しては何とか理解できました。
本当に長い間付き合っていただきました。改めてお礼申し上げます。

あとは繰り返し自分でコードを書いてみて覚えるしかないと思います。
自分で使ってみて新たな疑問を作り出してまた改めて質問をさせていただきます。
その時はまたよろしくお願い致します。
本当にありがとうございました(深く深く礼)。

お礼日時:2001/11/21 14:54

>「Set/Letでプロパティに値を渡してあげている」という感じがします。


>どうでしょうか。

ズバリです。


>ここで新たな疑問が湧いてきました。
>「Getは値を取得する」とありましたが、取得とはどのような動きを指しているのでしょうか。取得と代入の違いがいまいち分っていません。


もっと疑問の生まれるような発言をしちゃいます。

主にProperty関係はユーザコントロールやクラスで使用するのですが、実際に簡単なものに触れてみましょう。
プロジェクトを作成してください。
プロジェクトウィンドウで右クリックして「追加」→「ユーザコントロール」を指定してください。
以下のコードをユーザコントロールにセットしてください。
-----------
Option Explicit
'おなじみのモジュール変数
Private m_Text As String

'Textプロパティの値の入力処理
Static Property Let Text(String1 As String)
  m_Text = String1
End Property
'Textプロパティの値の出力処理
Static Property Get Text() As String
  Text = m_Text
End Property


'プロパティの値を読む
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
  m_Text = PropBag.ReadProperty("Text", "デフォルト文字")
End Sub

'プロパティの値を保持
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
  PropBag.WriteProperty "Text", m_Text
End Sub
-----------
このユーザコントロールはTextプロパティを持つようになりました。
#2のARCさんのサンプルは別にPropertyでなくてもいい事です。変数で済んじゃいます。
しかしReadPropertiesとWritePropertiesを使用することがPropertyを生かす事になります。

上記のコードを張ったユーザコントロールが作成できたら、ユーザコントロールのコードの書かれたモジュールとユーザコントロールのフォームを閉じて、フォーム1を開いてください。画面左側のツールボックスの中に、ユーザコントロールが登場します。それを選択して、貼り付けてください。テキストプロパティを持ったユーザコントロールがフォーム1に作成されます。
テキストプロパティに”ああああ”をセットして、プロジェクトを閉じてください。それからもう一度プロジェクトを開いてみてください。フォームの中のユーザコントロールに”ああああ”が保持されているはずです。
保持はWritePropertiesで行われています。
起動時にReadPropertiesが行われて、m_Textに”ああああ”がセットされます。
デザイン時にユーザコントロールを選択すると、プロパティウィンドウにユーザコントロールの一覧が出ますよね?それはProperty Get があるおかげで、表示されてるのです。

ためしにフォーム1にコマンドボタン1を作成し
Private Sub Command1_Click()
  MsgBox UserControl1.Text
End Sub
として、F8を連打(ステップ実行)して見てください。
MsgBoxを表示するタイミングで、ユーザコントロールのProperty Get Textを通るはずです。
MsgBoxはUserControl1のテキストプロパティの内容を表示するために、テキストプロパティの内容を要求します。要するにテキストプロパティの取得をするわけです。

今度はフォーム1にコマンドボタン2を作成し
Private Sub Command2_Click()
  UserControl1.Text = Now()
End Sub
としてステップ実行してみてください。
コマンドボタン2を押した時、テキストプロパティのセットですので Property Let Textを通ります。
これでユーザコントロールのm_Text変数が更新されていますので、今度はコマンドボタン1を押したらコマンド2を押した時間が表示されるはずです。

このプログラム中でセットした値は、WritePropertiesに反映されません。デザイン時に設定した値を保持します。
ですので、次回起動した時もテキストプロパティは"ああああ"という値を持っています。


もっと難解になったでしょうか?

>理解は進んだと感じていますがなんか混乱してきました(汗)。
>あきれずに教えてください!
プロパティの質問はC++に共通する部分があります。すごく奥の深いお題目です。用意に説明できるものでは無いと思ってます。ぼくも完全に極めているわけではないですが、バシバシ質問してください。

これは自己紹介にも書いているのですが、こうやって答える事が自分自身のスキルアップにつながると思ってます。

お互いがんばりましょう。
    • good
    • 0

まず最初に、標準コントロール以外の使用方法では、厳しいことを言ってすいませんでした。

。。しかしあのような学習方法が「人に聞かないでも推測でできるようになる」というための学習方法だと思って言わせていただきました。

このProperty Get/Let/Setはサンプルはあちこちに落ちてますが、説明が詳しく出てる書物は少ないので、わかりづらいと思います。
>しつこくてすみませんが
(・_・三・_・)ウウン
そんなこたぁありません。向上心があることはいい事です。そのしつこさが発展につながると思います。
ぼくもVBを覚える時には、今では恥ずかしくなってしまうような事をたくさん聞きまくってました。

>Getは代入と同じニュアンスでとらえてよろしいのですか?
>Set/Letに関してもオブジェクト変数に値をセットする感覚でしょうか?
ズバリです。

犬オブジェクトのプロパティに
「名前」
「首輪の有無」
「吠え方」
「おしっこの仕方」
「買主の名前」
があった時、
Set/Letで値やオブジェクトを代入
Getで値やオブジェクトを取得
します。

Set/Letの使い分けですが、型によって違います。
例えば普通のプログラム内で
Dim i As Long
Dim Frm As Form
などがあったとき、これらの変数は
i = 5
Set Frm = Form1
などとして使用します。

この使用方法と一緒で、
変数にオブジェクトを代入する時(普通のプログラムでSetが必要な型) → Set
変数に値を代入する時(普通のプログラムでSetが必要の無い型) → Let
として区別できます。

理解できたでしょうか?
まだわからなかったら、とことんお付き合いしますよ。

この回答への補足

>> まず最初に、標準コントロール以外の使用方法では、厳しいことを言ってすいませんでした。。。しかしあのような学習方法が「人に聞かないでも推測でできるようになる」というための学習方法だと思って言わせていただきました

ありがとうございました。
今、コントロール相手に格闘していますが、少しずつ理解ができるようになってきました。

本題のほうに入らせていただきます。

>変数にオブジェクトを代入する時(普通のプログラムでSetが必要な型) → Set
>変数に値を代入する時(普通のプログラムでSetが必要の無い型) → Let

これに関して僕なりの考えをいいますと、
「Set/Letでプロパティに値を渡してあげている」という感じがします。
どうでしょうか。

ここで新たな疑問が湧いてきました。
「Getは値を取得する」とありましたが、取得とはどのような動きを指しているのでしょうか。取得と代入の違いがいまいち分っていません。

理解は進んだと感じていますがなんか混乱してきました(汗)。
あきれずに教えてください!お願いします(深く深く礼)。

補足日時:2001/11/14 17:50
    • good
    • 0

おおーレスがあったのですねー


気が付きませんでしたー
_(..)_ごめんなさい。。。

MSDNのサンプルを見てくれたのですねー
そしたら次の段階を説明します。

まず前提に・・・

Private Type RECT
  Left As Long
  Top As Long
  Right As Long
  Bottom As Long
End Type
これの意味はわかりますか?
構造体ですね。
これを宣言してると
Dim workRect As RECT
RECT構造をもったworkRect変数
として、プログラム内で宣言することができます。

ユーザーコントロール、クラスファイルは変数ではありません。
ユーザーコントロールはオブジェクトであり
クラスファイルはクラスとして使用します。
ちょっと難しいかも知れませんが、変数以外のものとして捕らえてください。
コントロールの一つにテキストボックスがありますよね?
あれにも属性があります。
Aiignment
Appearance
BackColor
Text
などです。
これらはテキストボックスの属性(プロパティ)を表したり、値をセットすることができます。
それが Property [Get][Set/Let]です。


イメージとしては
Private Type TextBox
  Aiignment As Long
  Appearance As Long
  BackColor As Long
  Text As String
End Type
こんな感じでしょうか?

しかしTextBoxは変数の構造ではなく、オブジェクトの構造ですので、こういう書き方ではダメなのです。
そこで値を取得する時は
Property [Get]
値をセットする時は
Property [Set/Let]
を使用した内部構造を作成しなければなりません。

大まかに言うと、変数でいう構造体みたいなものです。(大まか過ぎるかな?)

少しつかめました?
疑問があったらレスください。

この回答への補足

ありがとうございます。
だんだん理解が進んできました。
もう少し聞きたいのですが、

Getは代入と同じニュアンスでとらえてよろしいのですか?
Set/Letに関してもオブジェクト変数に値をセットする感覚でしょうか?

しつこくてすみませんが、宜しくお願い致します。

補足日時:2001/11/12 13:20
    • good
    • 0

フォームやクラスモジュールに、新たにプロパティを追加するときに使います。



例えば、管理者モードと利用者モードの二つのふるまい方をする入力フォームを作りたいとしましょう。

仕様としては、入力フォーム内部では、mMode という変数を参照して、mModeが0のときは利用者モードとしてふるまい、mModeが1のときは管理者モードとしてふるまうものとします。

入力フォーム外部から動作モードを切り替えるには、Modeプロパティに0か1かを指定する物とします。また、それ以外の値を指定したときは、エラーメッセージを表示するとします。

このような場合は、以下のようにプログラムを組みます。(コードを見たほうが説明するより分かりやすいと思うんで)

入力フォームのコード
'(Genaral)(Declarations)
Dim mMode As Long '動作モード

'Modeプロパティ
Property Let Mode(Mode_ As Long) 'Modeプロパティを設定したときの動作
  Select Case Mode_
    Case 0
      mMode = 0 '利用者モードに切り替える
    Case 1
      mMode = 1 '管理者モードに切り替える
    Case Else
      'エラーメッセージを吐く
      Msgbox "指定した動作モードは定義されていないです。"
  End Select
End Property

Property Get Mode() As Long 'Modeプロパティを取得したときの動作
  Mode = mMode 'Modeプロパティの値として、mMode変数の値を返す。
End Property

Sub Form_Initialize()
  mMode=0'動作モードの初期値は利用者モード
End Sub

Sub フォーム中のコード()

  Select Case mMode
    Case 0
      '利用者モードのときのふるまいを記述
    Case 1
      '管理者モードのときのふるまいを記述
  End Select

End Sub

+-+-+-+-+-+-+-+-
入力フォームを呼び出すコード(Visual Basic用のコード。VBA用のコードではない)
Sub 入力フォームを管理者モードで開く()
  Load 入力フォーム 'フォームを準備
  入力フォーム.Mode = 1 '管理者モードに切り替え
  入力フォーム.Show 'フォームを表示
End Sub


尚、Property Let と Property Set は機能的には同じ物です。
Property Let は 変数をプロパティに指定するときに使い、Property Set はオブジェクトをプロパティに指定するときに使います。
Property Get は 変数であっても、オブジェクトであっても使えます。
    • good
    • 0

主にユーザコントロールやクラスを作成するときに使用するのですが、フォームでも使用可能です。



デザイン画面でプロパティウィンドウってありますよね。
あれにオリジナルのプロパティを追加するものだと思ってください。

MSDNにサンプルも入ってますよ。デバッグした方がつかめるかも?
ぼくのマシンでは
\Program Files\Microsoft Visual Studio\MSDN\2000OCT\1041\SAMPLES\VB98\
にサンプルがあります。その中でもDatAwareって言うのが一番わかりやすいと思います。
ちなみにMSDNのバージョンによって2000OCT\1041ではないと思いますので、注意してください。
もしサンプルがなかったらMSDNのCDに入ってると思います。SAMPLESでCD内を検索したら見つかると思います。

ユーザーコントロールやクラスファイルの存在するサンプルには、全てProperty [Let/Get]があるはずです。

この回答への補足

ありがとうございます。
サンプルでデバック実行してみました。
なんとなくわかったような分らないような感じです。

>>ユーザーコントロールやクラスファイルの存在するサンプルには、全て     Property [Let/Get]があるはずです

これの理由を教えていただきませんでしょうか。

申し訳ありません。お願い致します。

補足日時:2001/11/08 18:24
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QEXCEL VBA ワークシートのコピーについて

seaclearsky8です。

一つのブックに何枚ものワークシートを追加して保存するVBAについて
ご教授、よろしくお願いします。

コピー元 

MASTER Book MASTER Workseets

コピー先

Copy Book copy Worksheets


コピー元にはワークシートがMASTERワークシートの一枚しかありません。

その一枚のワークシートに値をVBAで入れていき処理し

コピー先のコピーBOOKにワークシートをコピーしていきたいです。

しかし、MASTERBOOKの処理が何通りかあり、

コピー元の一枚のワークシートに
処理別にデータを写し

コピー先BOOKに

         ワークシート名
ワークシート1 処理1ワークシート 
ワークシート2 処理2ワークシート
ワークシート3 処理3コピー元ワークシート3

という具合にワークシートを複数コピーしたいのですが

処理ごとにデータを代入し、コピー処理はできるのですが。

コピー先BOOK

ワークシート3 処理3ワークシート

だけしかコピーされてないBOOKが作成されます。
上書きされているのだと思われます。

対処法が調べましたが見つけられていません。

すいませんが対処法及び参考VBA等ご教授宜しくお願いいたします。

seaclearsky8です。

一つのブックに何枚ものワークシートを追加して保存するVBAについて
ご教授、よろしくお願いします。

コピー元 

MASTER Book MASTER Workseets

コピー先

Copy Book copy Worksheets


コピー元にはワークシートがMASTERワークシートの一枚しかありません。

その一枚のワークシートに値をVBAで入れていき処理し

コピー先のコピーBOOKにワークシートをコピーしていきたいです。

しかし、MASTERBOOKの処理が何通りかあり、

コピー元の一枚のワークシートに
処理別にデータを写し

コピ...続きを読む

Aベストアンサー

今どういうコードを書いているのか不明なので、とりあえず
「1つのシートを別のブックに複数回コピーする」ための参考ソースを書きます。
コピー元のブックに下記ソースを貼り付けて実行してもらえば
新規ブックにコピー元のシートが3枚コピーされると思います。
(新規ブックを追加しているのでシート数は3枚より多くなります)

Sub copySheet()
Dim masterWb As Workbook
Dim masterSh As Worksheet
Dim copyWb As Workbook

Set masterWb = ThisWorkbook
Set masterSh = masterWb.Sheets(1)
Set copyWb = Workbooks.Add

'ここからが実際のコピー処理です。
'単純に3回コピーメソッドを呼び出して3回コピーしています。
masterSh.Copy before:=copyWb.Sheets(1)
masterSh.Copy before:=copyWb.Sheets(1)
masterSh.Copy before:=copyWb.Sheets(1)

End Sub

今どういうコードを書いているのか不明なので、とりあえず
「1つのシートを別のブックに複数回コピーする」ための参考ソースを書きます。
コピー元のブックに下記ソースを貼り付けて実行してもらえば
新規ブックにコピー元のシートが3枚コピーされると思います。
(新規ブックを追加しているのでシート数は3枚より多くなります)

Sub copySheet()
Dim masterWb As Workbook
Dim masterSh As Worksheet
Dim copyWb As Workbook

Set masterWb = ThisWorkbook
Set masterSh = masterWb.Sheets(1)
Set copyWb = W...続きを読む

QEXCEL VBA でユーザー定義型データーをproperty get let を使って受け渡しをしたい

Excel2002Sp3を使用しています。
(WindowsはXpSp3です)

ユーザー定義型の各メンバーに対して、property get/let/set
を使用してデーターの受け渡しを行いたいのですが、うまくいきません。
以下に作成したプログラムを載せてみます。

main1()とmain2()がありますが、
main2()だとうまくいきます。
しかし、メンバー個別のやりとりにはなっていません。

main1()のようにメンバー個別でやりとりできるようにする方法がわかりません。

property get/let/setの書き方でできるようになるのでしょうか。
それとも、メンバー個別でのやり取りは仕様上できないのでしょうか。

もしできるのであれば、サンプルコードを教えていただけると助かります。
よろしくお願いします。

-------------------
Class1
-------------------
Option Explicit

Private m_xx As X

Public Property Get xx() As X
xx = m_xx
End Property

Public Property Let xx(p As X)
m_xx = p
End Property

-------------------
Module1
-------------------
Option Explicit

Type X
a As Long
b As Long
End Type


Sub main1()
'個別にやり取り
Dim cc As New Class1

Dim p As Long
Dim q As Long

cc.xx.a = 5
cc.xx.b = 2

p = cc.xx.a
q = cc.xx.b

MsgBox p & "," & q

End Sub


Sub main2()
'yyを用意してまとめてやり取り
Dim cc As New Class1

Dim p As Long
Dim q As Long
Dim yy As X

yy.a = 5
yy.b = 2

cc.xx = yy

p = cc.xx.a
q = cc.xx.b

MsgBox p & "," & q

End Sub

----------------------------------------

Excel2002Sp3を使用しています。
(WindowsはXpSp3です)

ユーザー定義型の各メンバーに対して、property get/let/set
を使用してデーターの受け渡しを行いたいのですが、うまくいきません。
以下に作成したプログラムを載せてみます。

main1()とmain2()がありますが、
main2()だとうまくいきます。
しかし、メンバー個別のやりとりにはなっていません。

main1()のようにメンバー個別でやりとりできるようにする方法がわかりません。

property get/let/setの書き方でできるようになるのでしょう...続きを読む

Aベストアンサー

#1 Wizard_Zeroです。

> これはVS2005等でもできないのでしょうか。

できません。そのようなコードを書いた時点でエラーが提示され、コンパイルできなくなります。


> Type XX・・・
> ごとにクラスを作るという理解でよろしいでしょうか。もしやるとなるとファイル数、すごく増えますね。

そうなりますね。
(クラス定義部分だけActiveX DLL化するという手もありますが・・・)


> 仮にそうした時、property get等の書き方はどのようになるでしょうか。

PropertyのLetとSetの違いは、扱う型が値型か参照型かです。クラスのような参照型を扱う際には、LetではなくSetを使います。

[ Class1 ]
Option Explicit

Private m_xx As New X '←クラスなのでNewでインスタンスを作成しておく

Public Property Get xx() As X
Set xx = m_xx '←戻り値の設定もSetで
End Property

Public Property Set xx(p As X)
Set m_xx = p '←ここも
End Property

#1 Wizard_Zeroです。

> これはVS2005等でもできないのでしょうか。

できません。そのようなコードを書いた時点でエラーが提示され、コンパイルできなくなります。


> Type XX・・・
> ごとにクラスを作るという理解でよろしいでしょうか。もしやるとなるとファイル数、すごく増えますね。

そうなりますね。
(クラス定義部分だけActiveX DLL化するという手もありますが・・・)


> 仮にそうした時、property get等の書き方はどのようになるでしょうか。

PropertyのLetとSetの違いは、扱う型...続きを読む

QEXCEL VBA ワークシートのコピーについて

seaclearsky8です。

一つのブックに何枚ものワークシートを追加して保存するVBAについて
ご教授、よろしくお願いします。

コピー元 

MASTER Book MASTER Workseets

コピー先

Copy Book copy Worksheets


コピー元にはワークシートがMASTERワークシートの一枚しかありません。

その一枚のワークシートに値をVBAで入れていき処理し

コピー先のコピーBOOKにワークシートをコピーしていきたいです。

しかし、MASTERBOOKの処理が何通りかあり、

コピー元の一枚のワークシートに
処理別にデータを写し

コピー先BOOKに

         ワークシート名
ワークシート1 処理1ワークシート 
ワークシート2 処理2ワークシート
ワークシート3 処理3ワークシート

という具合にワークシートを複数コピーしたいのですが

処理ごとにデータを代入し、コピー処理はできるのですが。

コピー先BOOK

ワークシート3 処理3ワークシート

だけしかコピーされてないBOOKが作成されます。
上書きされているのだと思われます。

対処法が調べましたが見つけられていません。

すいませんが対処法及び参考VBA等ご教授宜しくお願いいたします。

seaclearsky8です。

一つのブックに何枚ものワークシートを追加して保存するVBAについて
ご教授、よろしくお願いします。

コピー元 

MASTER Book MASTER Workseets

コピー先

Copy Book copy Worksheets


コピー元にはワークシートがMASTERワークシートの一枚しかありません。

その一枚のワークシートに値をVBAで入れていき処理し

コピー先のコピーBOOKにワークシートをコピーしていきたいです。

しかし、MASTERBOOKの処理が何通りかあり、

コピー元の一枚のワークシートに
処理別にデータを写し

コピ...続きを読む

Aベストアンサー

> 配列にワークシートのオブジェクトを入れることとか可能なのでしょうか?

それは多分できないと思います。


> 複数のセル・シートを何回もコピーする場合にでるらしいです。

多分、メモリをたくさん使っちゃってるせいでしょうね。
まず、メモリ使用を減らすようにしましょうか。

・testwriteの最後にオブジェクト変数のメモリ解放を行う。
 具体的には以下のように書く。もうやってたらすみません。
Set cbook = Nothing
Set mastersheet = Nothing
・testwriteの中でのブックオープンおよび保存をやめる。
 新規ブックのオープンをtestwriteを呼ぶ前に1度だけ行い、
 testwriteの中ではその新規ブックに対してシートを追加していく。
 そしてtestwriteの処理が全部終わったら、
 新規ブックの全シートを1度に「記録シートYYYY/MM/DD.xls」にコピーする。

それでも駄目でしたら、以下の回答No.1を試してみてください。
http://oshiete.goo.ne.jp/qa/1822561.html

> 配列にワークシートのオブジェクトを入れることとか可能なのでしょうか?

それは多分できないと思います。


> 複数のセル・シートを何回もコピーする場合にでるらしいです。

多分、メモリをたくさん使っちゃってるせいでしょうね。
まず、メモリ使用を減らすようにしましょうか。

・testwriteの最後にオブジェクト変数のメモリ解放を行う。
 具体的には以下のように書く。もうやってたらすみません。
Set cbook = Nothing
Set mastersheet = Nothing
・testwriteの中でのブックオープンおよび保存をやめ...続きを読む

QSETステートメントについて

こんにちは^^
vb6.0のSETステートメントについて質問です。
SETの使い方がいまいちよくつかめないのですがどういった時に使われるものなのでしょうか?

Aベストアンサー

オブジェクト変数への代入で使用します。

こちらの説明がわかりやすそうです。
http://homepage1.nifty.com/CavalierLab/lab/vb/clsmdl/instance.html

QEXCELのVBAでシートコピーをしたとき元のマクロを削除するには?

VBAのマクロでシートのコピーをしたいのですが、元のシートにはVBAのコードが含まれています。コピーするのはデータだけのコピーが必要で、マクロ自体は必要ないのですが、それを削除するコードはどのように書いたらいいのでしょうか?
どうしてもコピーしたファイルを開くと「マクロが含まれています」という確認メッセージが出てしまうのですが、それもなくしたいのです。
シートにフォームのボタンが配置されている場合も同様に、そのボタン自体をなくした状態でコピーを行いたいのですが・・・。プログラムで行うのは不可能なのでしょうか?

Aベストアンサー

No2です。
サンプルコードを書いてみました。
「オリジナル」という名前のシートを別ブックとしてコピペ保存します。

Sub サンプル()
Dim sc As Integer
sc = Application.SheetsInNewWorkbook
Application.SheetsInNewWorkbook = 1
ThisWorkbook.Sheets("オリジナル").Cells.Copy 'コピー
Workbooks.Add 'ブック追加
Sheets("Sheet1").Range("A1").PasteSpecial Paste:=xlValues '値貼り付け
Sheets("Sheet1").Range("A1").PasteSpecial Paste:=xlFormats '書式貼り付け
Sheets("Sheet1").Name = "コピー"
Application.CutCopyMode = False
Application.SheetsInNewWorkbook = sc
ActiveWorkbook.Close
ThisWorkbook.Activate
End Sub

No2です。
サンプルコードを書いてみました。
「オリジナル」という名前のシートを別ブックとしてコピペ保存します。

Sub サンプル()
Dim sc As Integer
sc = Application.SheetsInNewWorkbook
Application.SheetsInNewWorkbook = 1
ThisWorkbook.Sheets("オリジナル").Cells.Copy 'コピー
Workbooks.Add 'ブック追加
Sheets("Sheet1").Range("A1").PasteSpecial Paste:=xlValues '値貼り付け
Sheets("Sheet1").Range("A1").PasteSpecial Paste:=xlFormats '書式貼り付け...続きを読む

QSetステートメントの使い方について

いつもお世話になっています。
私は普段あまりVBを使わないので、素人同然なのですが、たまたま
業務でVBを使う事になったのですが、一つ疑問に思う事があります。

オブジェクトを扱う際に Set ステートメントと言うものがありますが、
この Set ステートメントを付けた時と、付けなかった時で何が違うのでしょうか?

おそらく、メモリの利用方法が違うのかと思いますが、どなたか簡潔にお答え
頂けないでしょうか?
素人考えでは、普通に代入(Setステートメントを使わない)した場合は、
オブジェクトのリファレンスが渡り、Setステートメントを使用した場合は、
内容が渡るのかなぁ。。。
と、おぼろげに考えてはいるのですが。。。

よろしくお願い致します。

Aベストアンサー

Setをつけなかった場合Letを付けたのと同じになります。

Setはメモリアドレスを変数にコピーするだけで、実際の内容はコピーされません。
そのため、この動作は4バイトのデータだけをコピーするだけなので、時間はかかりません。
ただし、あらたに代入された変数で内容を変更しようとすると、元のものも変更されてしまいます。

たいしてLetすると、メモリの内容をコピーします。
これは、オブジェクトの容量によって、極端にパフォーマンスが落ちることもあります。

mrt136さんが予想した逆でした。

QVBAのワークシートの追加とコピーなんですが。

VBAのワークシートの追加とコピーなんですが。


sheet1の原紙をすべてコピーして、

新しくワークシートを追加してそのシートに貼り付けるプログラムを

教えてください。

Aベストアンサー

With ActiveWorkbook
  aaa = .Sheets("Sheet1").Cells(9, 4).Value 'aaaは社員
  bbb = .Sheets("Sheet1").Cells(9, 5).Value 'bbbは4月
  .Sheets("Sheet1").Copy After:=.Sheets(.Sheets.Count)
End With
ActiveSheet.Name = aaa & bbb

QVB.NET getとsetの概念がわかりません。

GetとSetがどういう働き・意味をもっているのか理解できていません。

たとえばSpecialTextBoxというクラスがあったとします。
***************************************************************
Imports System.Web.UI.MobileControls

Partial Class SpecialTextBox
Inherits System.Web.UI.MobileControls.MobileUserControl

Public Property Item() As SelectionList

Get
Return Me.CheckBox
End Get
Private Set(ByVal value As SelectionList)
Me.CheckBox = value
End Set

End Property

End Class
****************************************************************

ここでのGet Setはどういう動き・働きをしているんでしょうか?
わかる方がいたらご助言お願いいたします。
(サンプルソースなどがあれば理解しやすいかもしれません。。)

GetとSetがどういう働き・意味をもっているのか理解できていません。

たとえばSpecialTextBoxというクラスがあったとします。
***************************************************************
Imports System.Web.UI.MobileControls

Partial Class SpecialTextBox
Inherits System.Web.UI.MobileControls.MobileUserControl

Public Property Item() As SelectionList

Get
Return Me.CheckBox
End Get
Private Set(ByVal value As Sele...続きを読む

Aベストアンサー

getはそのインスタンスから値を取り出します。
setはそのインスタンスに値を設定します。
あなたの例だと、GetはCheckBoxの値を取り出します。
SetはCheckBoxに指定した値を設定します。

QEXCEL2002で、ブック内のワークシートを他のブックに(VBA含む丸ごと)コピーして移す方法

 EXCEL2002で、ブック内のワークシートを他のブックに(VBA含む丸ごと)コピーして移す方法
 普通のやり方では、セルの数字、値だけで、通常は、中身の重要な"関数式"であったり、VBA等のプログラムまで、コピーされることは、ありませんので、そこまで、出来る方法を教えて下さい。

Aベストアンサー

コピー元のBookとコピー先Bookをどちらも開いて
Excel画面上に並べます(左右に並べる方が作業しやすいと思います)

Ctrlキーを押しながら、コピーしたいシートのタブ部分を
クリック長押しすると、+マークと▲マークが出てきます。
マークが出てきたら、新しいBookにドラッグ&ドロップ で
シートコピーが出来ます。

全く同じシートがコピーされ、マクロもコピーされます。

QエクセルVBA Property Let について

クラスの勉強中です。
http://excelwork.info/excel/classpropertylet/
上記URLの記述において、

Private p_Name As String
Private p_Age As Long

'Property Let ステートメント
Public Property Let Name(str As String)
p_Name = str
End Property

確認のために、Nameがプロパティの名前で、strはただの変数、ですよね?
p_Nameこれは何ですか?strを経由してここに代入される値が実際のプロパティの値になるようですが「p_NameがNameプロパティの実際の値を示す」と、どうやって分かるのですか?単に代入文の左辺にあるから?1個のLetステートメントには1個の変数しか左辺に置けないルールになってるのでしょうか?また、なんでName=strと表現しないのですか?ややこしいだけに見えます。

Aベストアンサー

> p_Nameこれは何ですか?
> なんでName=strと表現しないのですか?

それは、クラスの内部変数(ご質問でのp_Name)が、必ずしもプロパティを介してクラス外部とやり取りする値(ご質問でのstr)と一致しないからです。

内部変数に代入する前に、Letプロパティで与えられた値が適切なものかチェックし、適切でないならデフォルト値を代入するような処理をしたりすることもあります。

また、普通はプロパティの名前や値はクラスを使用する人が、それがどの様なものか想像しやすい名前や形式をとるようにします。
でも内部変数はクラスの設計者が扱い易い形式で保存させます。その為の変換処理を行うのがPropertyで記述される処理です。


> 単に代入文の左辺にあるから?1個のLetステートメントには1個の変数しか左辺に置けないルールになってるのでしょうか?

例えば、プロパティ名は姓名であっても、クラス設計者がクラス内部では姓と名を分けて保持したければその様にすれば良いし、一つで管理したければそう管理すれば良いのです。



以下、クラス内部では西暦で保持していますが、Heiseiプロパティを使用すれば、平成の年号でやりとりができます。
-----------------------
Sub sample()
  Dim a As Object
  Set a = New Nengou
  
  MsgBox a.Heisei ' 28と表示
  
  a.Seireki = 2020
  MsgBox a.Heisei ' 32と表示
End Sub


----Nenngou-----
Private p_year As Long

Private Sub Class_Initialize()
  p_year = Year(Now)
End Sub

Property Let Seireki(y As Long)
  If y >= 1 Then
    p_year = y
  Else
    p_year = 1
  End If
End Property

Property Get Seireki() As Long
  Seireki = p_year
End Property

Property Let Heisei(y As Long)
  If y >= 1 Then
    p_year = y + 1988
  Else
    p_year = 1
  End If
End Property

Property Get Heisei() As Long
  Heisei = p_year - 1988
End Property

-----

> p_Nameこれは何ですか?
> なんでName=strと表現しないのですか?

それは、クラスの内部変数(ご質問でのp_Name)が、必ずしもプロパティを介してクラス外部とやり取りする値(ご質問でのstr)と一致しないからです。

内部変数に代入する前に、Letプロパティで与えられた値が適切なものかチェックし、適切でないならデフォルト値を代入するような処理をしたりすることもあります。

また、普通はプロパティの名前や値はクラスを使用する人が、それがどの様なものか想像しやすい名前や形式をとるようにします。
...続きを読む


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

人気Q&Aランキング