• ベストアンサー

ExcelVBAのSetステートメントについて

お世話になります。 この土日で、ExcelVBAの勉強でもしようと思っていたのですが 掲題の件で躓いてしまいました。 具体的には、オブジェクト変数には、Setステートメントを使って 「オブジェクトへの参照」を代入するということらしいのですが、 恥ずかしながら理解できませんでした。 当方、財務・法務を担当しているのでプログラミングとは無縁の キャリアを歩んできました。 Setステートメントについて、知見のある方からご指導いただけると 幸いです。どうぞ、よろしくお願い申し上げます。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

使い方の理解という事であれば、 文字列(String)、数値(Integer等いろいろ)、真偽値(Boolean)、日付(Date)以外の変数はオブジェクト型で、そこへの代入はSetを付けた代入を使います。 文字列、数値などは、Set無しの代入を使います。 使い方の質問では無く、そもそも、オブジェクトとはなんぞや?参照とは?という質問であれば、ゼロから説明するのは大変なので、入門書を読んでください。

retweet
質問者

お礼

ご回答ありがとうございました!

その他の回答 (3)

  • chayamati
  • ベストアンサー率41% (254/607)
回答No.4

今晩は、回答No.3です。 躓きの内容が分かりませんので、手探りになります。 セルの式で A1=A1+1は循環参照として、受け付けられませんが VBAでは A = A + 1 は普通に記述できます 「=」野意味を 右側の式の結果を左側の変数の値とすると動的なものです。 使用例 A = 0 For I = 1 To 10 Step 1 A = A + I Next I これを実行すると Aの値は55です

retweet
質問者

お礼

ご回答ありがとうございました!

  • chayamati
  • ベストアンサー率41% (254/607)
回答No.3

ご存知とは思いますが、「VBAとはVisual Basic for Applications」 の頭文字で、Applications(最後尾が複数形のs) 本題に入ります ExcelVBAですので,Worksheetのハンドリングが目的です。 ・一塊のVBAは「SUB プログラム名()で始まり        「END SUB で終わります」 ・マクロの記録は操作手順をVBAに記録します。 ・特定のセルは Range(アドレス)と記述します  また、別で計算した列名、行No.を用いて         Range(列名 & 行名)も可能です ・通常計算はセルに式を記述しますが、  VBAではステートメントが実行された時に計算結果の値を         Range(アドレス)に反映されます 注プログラムを終了して、保存するときは添付のように マクロ有効ブック(*.xlsm)形式で保存します

retweet
質問者

お礼

ご回答ありがとうございました!

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

まづ、エクセルで初めになじみのオブジェクトはWorksheetオブジェクトです。 その下(構成員)のセルを表す(捉える)には Sub test01() ActiveWorkbook.Worksheets("Sheet1").Range("a1").Value = "aaa" End Sub のように書けるのですが、 ActiveWorkbook.Worksheets("Sheet1")の部分の記述が長いので、 Sub test02() Dim ws1 As Worksheet Set ws1 = ActiveWorkbook.Worksheets("Sheet1") ws1.Range("a2").Value = "bbb" End Sub としたりします。 小生は要領的に、置き換わる記述と、記号的に考えてます。 昔のBasicでは、値の代入は、Let s=1のように書く文法でした。 略して、s=1のようにもかける処理系が出回りました。 それがVBへやオブジェクト指向的に進化して、Objectの定義はSet をつけ、値の代入では、Letをつけないようになり、VB,VB.Net系でも続いています。 ーー 付け加えて、オブジェクトの上位の記述を省略できる場合があり、省略したとき の記述と、記述例を見て、本件話題の関連性に戸惑うかもしれない。 また「Active何とかオブジェクト」という記述ができる場合があることに注意。

retweet
質問者

お礼

ご回答ありがとうございました!

関連するQ&A

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

    いつもお世話になっています。 私は普段あまりVBを使わないので、素人同然なのですが、たまたま 業務でVBを使う事になったのですが、一つ疑問に思う事があります。 オブジェクトを扱う際に Set ステートメントと言うものがありますが、 この Set ステートメントを付けた時と、付けなかった時で何が違うのでしょうか? おそらく、メモリの利用方法が違うのかと思いますが、どなたか簡潔にお答え 頂けないでしょうか? 素人考えでは、普通に代入(Setステートメントを使わない)した場合は、 オブジェクトのリファレンスが渡り、Setステートメントを使用した場合は、 内容が渡るのかなぁ。。。 と、おぼろげに考えてはいるのですが。。。 よろしくお願い致します。

  • エクセルVBAのSETステートメントについて

    マクロを組み込んだエクセルファイルが完成したのですが、ファイルサイズが大きくなってしまった ため、ファイルサイズを軽くするために現在 試行錯誤を繰り返しています。(シート数:50シート) ファイルサイズを軽くするために今までに取り組んできたのは下記の9項目です。 ・数式を値に変換 ・シートイベントプロシージャをThisWorkbookイベントに変換してマクロ構文を簡素化 ・隠れオブジェクトを全て削除(オブジェクト数を最小限・最小サイズに抑える) ・条件付書式、入力規則、名称登録を最小限に抑える ・必要な条件付書式のセル番地には必ず 『 $ 』 を付ける ・Offset 構文を最小限に抑える ・未使用セルの削除(最終セルの位置を正常化) ・Call マクロを多用してマクロ構文の情報量を極力減らす ・型に応じた変数宣言を徹底(バリアント変数扱いを最小限に抑える) ただ、『 型に応じた変数宣言 』 のSETステートメントの正しい使い方について私自身が良く理解 をしていないためにご指導を頂きたく投稿をさせて頂きました。不明なのは下記の2点です。 (1)『 SET a = ○○○○ 』 はオブジェクト型変数に対してのみ使用するものなのでしょうか?   データ型(Date)や文字列型(String)の変数に対してはSETステートメントは使用しないもの   なのでしょうか?仮にデータ型や文字列型変数に対してSETステートメントを使用した場合の   メリットとデメリットについて教えて下さい。もしかして、データ型や文字列型の変数の場合は   ただ単純に 『 SET 』 の文字が省略されているだけなのでしょうか。この基本的な部分の   理解ができていないので、理屈が分からずに困っております。 (2)『 SET a = Nothing 』 の対応はどこまで必要なのでしょうか?   上記(1)の質問にも絡むのですが、メモリリソースを開放してファイルサイズを軽くするためには   『 SET a = Nothing 』 が有効であるという情報がインターネット上に多数掲載されてますが   データ型や文字列型変数に対してもプロシージャの末尾に 『 SET a = Nothing 』 の構文   を付け加えた方がファイルサイズが軽くなるものなのでしょうか?   また、下記マクロ処理の場合にも 『 SET a = Nothing 』 の構文は必要なのでしょうか?        'Shをオブジェクト型変数として宣言     Dim Sh As Worksheet           :           :     '全てのシートに対して以下の処理を実行     For Each Sh In Worksheets            固有のシートに対してではなく全てのシートに           :                      対してマクロを実行する処理においても           :                      末尾に 『 SET a = Nothing 』 の構文を     '次のブックに対しても同様の処理を実行   付け加えた方がファイルサイズが軽くなる     Next Sh                        ものなのでしょうか? とにかく、正攻法でファイルサイズを軽くする方法を探しています。コメントが長くなり過ぎてしまい ましたが、『 SETステートメントの正しい使用方法 』、『 ファイルサイズを軽くするための裏技 』 などについて、ご存知の方がいらっしゃいましたら是非教えて頂けますよう宜しくお願いします。

  • ExcelVBA オブジェクトのアドレスについて

    VarPtr関数とObjPtr関数を使って、オブジェクト変数とオブジェクトのアドレスを確かめてみようと、下記コードを実行してみたのですが、イミディエイトウィンドウに表示された実行結果が合致しませんでした。同一のオブジェクトであれば、メモリ上はオブジェクト変数とオブジェクトは、同じアドレスを参照するものと理解していたのですが、異なる結果となり頭が「???」という状態です。ご知見のある方、お知恵の拝借をいただけませんでしょうか?(環境:Win10(64bit)+Excel2019) Sub MySub() Dim wb As Workbook Set wb = ThisWorkbook Debug.Print VarPtr(wb) Debug.Print ObjPtr(wb) End Sub

  • ExcelVBAで参照設定を自動に行う

    AccessのVBAではReferencesコレクション中のReferenceオブジェクトを使用して、行うことが出来ると、ネット上で読みました。 Excel2003で同じ事を行おうと、コーディングをしたところ、変数の宣言で「... As 」まで記述したところに表示されるメニュー(?)に、「Reference」が表示されませんでした。 「ExcelVBAで参照設定を自動に行う」方法、もしくは私の環境のExcel2003で「Reference」が表示されない考えられる原因を教授下さい。 よろしくお願いします。

  • ExcelVBA ファイルオープン時に使用中でないか調べる方法

    [技術者向] コンピューター > プログラミング > その他(プログラミング) でも質問させて頂いたのですが URL:http://oshiete1.goo.ne.jp/qa3166356.html 回答を得ることができず、こちらのカテゴリを勧められた為、再度質問させて頂きます。 ExcelVBAの勉強を始めて間もない者です。 Office2000のExcelでマクロを作成しています。 テキストストリームオブジェクトを作成してファイルを開き、 ファイルの内容をセルに展開するプログラムを書いているのですが、 開こうとしているファイルが他のプロセスで開かれているかどうかを調べる方法はありませんか? Openステートメントを使用すればロックをかけることができるので、 エラーを発生させることができるみたいなのですが、 テキストストリームオブジェクトを使用してファイルを開いている場合に 開くファイルが他のプロセスで使用してるか調べる方法が知りたいです。 説明がわかりにくいとは思いますがよろしくお願いします。

  • FileDialog オブジェクトでファイル名のみを取得

    FileDialog オブジェクトで返すオブジェクトを参照すると どうしてもファイルパスを取得する変数しか取得できません。 FileDialog オブジェクトで選択したファイルのファイル名のみを取得するにはどうしたらよいでしょうか。 ExcelVBAです。よろしくお願いします。

  • SetとNothingの存在意味?

    数値とオブジェクトの変数セットはそれぞれ、 Dim num as integer num = 5 Dim obj as Object set obj = new From set obj = Nothing ですが、 オブジェクトの場合でインスタンスを生成しない、単なる参照?別名? の場合はNothingは不要でしょうか? Dim obj as Object For x = 1 to 10 set obj = Form2 ' newとインスタンスを生成するのではなく、単なる参照  obj.Caption = str(x) & "回目" 'set obj = nothingは不要? Next x

  • クラス変数について質問

    Javaのオブジェクト指向を解説した参考書で現在勉強しているのですが、その参考書のある問題の答えの解説として「クラス変数は参照変数なので参照以外を代入できません」と書いてありました。 でも、例えば、static int n=0と書けば、0をnに代入できます。 因みに、「クラス型の変数」は参照しか代入できないのはわかっています。 よって「クラス変数」は誤植で、正しくは「クラス型変数」なのでしょうか?

    • ベストアンサー
    • Java
  • ExcelVBA : GetObject関数でのユーザーフォームの参照

    ExcelVBAでGetObject関数を使用すると起動中のExcelを参照できると思います。 その際、参照先のセルの値を変更はできるのはわかるのですが フォームの中身(コントロールなど)を変更したりすることはできるのでしょうか? 現在、ラベルの値を変更しようとしているのですが Dim ○○ As Object Set ○○ = GetObject("C:\XXX.xls") ~~~~~~~~~~~~~~~~~~~~ ○○.UserForm1.Label1 = 5 ですが最後の行で実行エラーになります。 オブジェクトの階層が違うような気もしてはいるのですが解決方法が見つかりません。 何か良い方法をご存じの方は教えていただけないでしょうか?

  • ExcelVBAにて、選択されているセルの行番号取得が上手くいきません。

    こんにちは、TwinsAngelです。 Dim ActiveRow as Integer Set ActiveRow = ActiveCell.Row ↑この部分で、オブジェクトが必要です。 といわれてしまいました。 型をIntegerから、Rangeに変更してみたところ、 型が一致しません。といわれてしまいましたので、 Integerに直しました。 無事に、変数へ行番号を代入するには、どうしたらよいでしょうか? 教えてください。

専門家に質問してみよう