• ベストアンサー

クラスの宣言について教えてください。(エクセル)

ヘルプを読むと、印刷設定のPageSetupで、Orientationには、XlPageOrientation クラスの定数が返されるとあります。私が持っている本で、宣言を調べたら、バイト型、ブール型、整数型、・・・・とありクラス型ってのがありません。どれを選べばいいのですか?(すみません、今まで宣言を行なわずにいました)ちょー、基本的なことですみません。宜しくお願い致します。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.12

こんばんは。 onlyrom さんへ >ということは他に何かある??? 私は、別に文句をつけたわけではありませんので、気に障りましたら、お許しください。 たぶん、 >「a=60 * 60 * 24」は回答にもありますように「使い方自体を間違っています」 というのは、私の書いた内容自体が、Variant型の宣言の是非には当たらないとおっしゃるのでしょうけれども、それは、今回、リテラルで書いたのですから、ご指摘のとおりです。適当な例ではありませんでした。 変数 a を Long型に書いたところで、それはエラーを変えようがないわけです。本来は、リテラルで書くこと自体が問題といえば、それまでですが、ただ、これは、オーバーフローになっている理由は、それが、Interger 型の範囲(32767)を越えているので、エラーが出ています。演算する場合、変数に入れない限り型のキャストが利きません。 Variant 型というのは、VB/VBAの自動キャスト(型の内部変換)機能を使っているわけで、Variant型という大きな入れ物で値をやり取りするというのは、あまり入門レベルの人以外は、関心できません。その理由は、Variant型は複合的な型であり、値の内部処理をします。メモリは22バイトであり、それに文字列の場合は、さらに加わります。それだけ、メモリ負担が大きくなります。また、変数の暗黙的型のキャストを避け、必ず変数の型を把握しながら明示的にコードを書くべきだと思っています。そのほうが、コーディングが分りやすいし、エラーが少ないのです。 例えば、以下のような例の場合は、b が、数値に変ってしまいます。 Sub TestA() Dim a, b, c  a = 1  b = "60"  c = a + b  '61 End Sub これは、変数の中で、自動的にキャストされて計算しています。本来は、b に文字列が入ることは弾くべきですね。 次に、以下のような場合、a は、Double型に変りますが、本来、その必要性がない場合は、Single型などでよいわけで、そうすることによって、演算スピードを上げることが出来ます。 Sub TestB() Dim a  a = 1.1 End Sub 他にも、時間計算で演算をする場合は、Variant型では正確な数字が出てこないことがあります。 以下は、また、別な例です。引数の宣言を明示的に行わないと、エラーになります。 Sub Test() Dim a Dim b As Variant a = "abc"  b = TestFunction(a) End Sub Function TestFunction(myStr As String)   TestFunction = myStr + Str(Len(myStr)) End Function a は、String 型に自動キャストされているはずですが、TestFunction の引数では、受けられませんね。では、Function側の引数の型を変えるべきでしょうか?それは、メモリ負担だけではなく、関数の引数の型を限定することによって、正しい値を返すことが目的です。Variant型で引数を設定するようなユーザー定義関数の作り方は、よほど初心者でない限りは、一般的ではありません。 精密な計算をする場合、浮動小数点丸めを嫌う演算には、当然ですが、キャストは利きません。明示的にDecimal 型や、Currency型が必要です。(ただし、Decimal 型の変数宣言はありませんので、CDecで変数の型を変えてあげる必要があります。)また、この他、暗号システムで使う、一般的には、多倍長整数型と言われている大きな数を用いる時などは、当然、Variant 型は使えません。 他にも、Win32 API関数は、明示的な変数の型の宣言をしないと、Applicationエラーになることがあります。 今、思いつくところでは、こんなところが挙げられます。

その他の回答 (14)

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.4

おはようございます。 >質問の仕方が悪かったようです I think so, too! (^^;;; >そのxlLandscapeの値を代入する変数の宣言は、何の型で行なえばいいのでしょうか?ってことです。 それはNo1さんの回答、及び当方の回答の最初の部分に書いてありますよね。 Orientation プロパティ  オブジェクトの向きや位置を設定  値の取得および設定が可能 ▲▲▲ 長整数型 (Long) の値を使用 ▲▲▲ Long型です。 再度の勘違いでしたらスルー願います。(^^;

vba_minarai
質問者

補足

いえいえ、間違っているのは私のほうですから!!気分を害さないでお付き合いください。私のヘルプには書いていないような気がします。(2003です)ヘルプを転記します。(法的に問題ないのかな?) ヘルプの見方(検索の仕方?)が間違っているのでしょうか?(質問が、ヘルプの見方に変わってしまっていますが・・?)宜しくお願いします。 Orientation プロパティ 関連項目対象使用例アプリケーション情報Orientation プロパティを TextFrame オブジェクトに指定した場合 文字列のレイアウト枠の向きを設定します。-90 ~ 90 の角度 (°)、または MsoTextOrientation クラスの定数を使用します。値の取得および設定が可能です。 使用できる定数は、次に示す MsoTextOrientation クラスのいずれかです。 msoTextOrientationDownward msoTextOrientationHorizontal msoTextOrientationHorizontalRotatedFarEast msoTextOrientationMixed msoTextOrientationUpward msoTextOrientationVertical msoTextOrientationVerticalFarEast expression.Orientation expression 必ず指定します。TextFrame オブジェクトを返すオブジェクト式を指定します。 Orientation プロパティを Style オブジェクトに指定した場合 文字列の向きを設定します。-90 ~ 90 の角度 (°)、または XlOrientation クラスの定数を使用します。値の取得および設定が可能です。 使用できる定数は、次に示す XlOrientation クラスのいずれかです。 xlDownward xlUpward xlHorizontal xlVertical expression.Orientation expression 必ず指定します。Style オブジェクトを返すオブジェクト式を指定します。 Orientation プロパティを PageSetup オブジェクトに指定した場合 印刷の向き (縦と横) を設定します。値の取得および設定が可能です。XlPageOrientation クラスの定数を使用します。 使用できる定数は、次に示す XlPageOrientation クラスのいずれかです。 xlPortrait xlLandscape expression.Orientation expression 必ず指定します。対象となる PageSetup オブジェクトを返すオブジェクト式を指定します。 Orientation プロパティを CubeField オブジェクト、または PivotField オブジェクトに指定した場合 ピボットテーブル レポート内でのフィールドの位置を設定します。値の取得および設定が可能です。XlPivotFieldOrientation クラスの定数を使用します。 使用できる定数は、次に示す XlPivotFieldOrientation クラスのいずれかです。 xlColumnField xlDataField xlHidden xlPageField xlRowField expression.Orientation expression 必ず指定します。上のいずれかのオブジェクトを返すオブジェクト式を指定します。 Orientation プロパティを TickLabels オブジェクトに指定した場合 文字列の向きを設定します。-90 ~ 90 の角度 (°)、または XlTickLabelOrientation クラスの定数を使用します。値の取得および設定が可能です。 使用できる定数は、次に示す XlTickLabelOrientation クラスのいずれかです。 xlTickLabelOrientationAutomatic xlTickLabelOrientationHorizontal xlTickLabelOrientationVertical xlTickLabelOrientationDownward xlTickLabelOrientationUpward expression.Orientation expression 必ず指定します。TickLabels オブジェクトを返すオブジェクト式を指定します。 Orientation プロパティを AxisTitle オブジェクト、CellFormat オブジェクト、ChartTitle オブジェクト、DataLabel オブジェクト、DataLabels コレクション オブジェクト、DisplayUnitLabel オブジェクト、Range オブジェクトに指定した場合 文字列の向きを設定します。使用できる範囲は、-90 ~ 90 の角度 (°) です。値の取得および設定が可能です。バリアント型 (Variant) の値を使用します。 expression.Orientation expression 必ず指定します。上のいずれかのオブジェクトを返すオブジェクト式を指定します。 解説 OLAP データ ソースの場合、ある階層の 1 つのフィールドに対してこのプロパティを設定すると、同じ階層のその他のフィールドにも同じ値が設定されます。ディメンション フィールドは、ピボットテーブル レポートの行フィールド、列フィールド、またはページ フィールドの各領域にのみ配置できます。メジャー フィールドは、データ エリアにのみ配置できます。階層、またはデータ フィールドに xlHidden を設定すると、ピボットテーブル レポートから削除されます。

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.3

こんばんは。 それは宣言部分に宣言するものではありません。 ヘルプをじっくりと眺めると分かると思います。 Orientation プロパティ  オブジェクトの向きや位置を設定  値の取得および設定が可能  長整数型 (Long) の値を使用 PageSetupオブジェクトでは印刷の向き (縦と横) を設定したい時にOrientationプロパティを使います。 そしてその縦横を設定するの為の定数が、lPageOrientationクラスのxlLandscape、xlPortraitのどちらかというわけです。 因みに次のように使います。 ActiveSheet.PageSetup.Orientation = xlLandscape(横向き) ActiveSheet.PageSetup.Orientation = xlPortrait(縦向き) これからも分かるように宣言部分に宣言するものではありません。 いまはXlPageOrientationクラス云々より、印刷の向きを設定するときには、Oritentationプロパティを使う、そしてその縦横は定数、xlLandscape , xlPortraitのどちらかを使うと軽く覚えてください。 クラス云々は追々理解できるはずです。  

vba_minarai
質問者

補足

質問の仕方が悪かったようです。やりたいことは、一つのシートに複数のページ設定を行ないたいのですが、一度pagesetpuのメンバーを全て変数に代入し、新しくシートを作ってそのシートにページ設定の値を書き写し、表示をタグの表示を消して設定値を保存して置くつもりです。(ココで、教えて頂きました)そして、必要に応じて、目的のシートのページ設定を切替え、あたかも複数のページ設定が行なえかのように振舞えるようにしようと思いました。 その過程で、一度lPageOrientationクラスのxlLandscape、を変数に代入する必要があります。で、そのxlLandscapeの値を代入する変数の宣言は、何の型で行なえばいいのでしょうか?ってことです。 自分でも、読み返してみて、教えて頂きたいことから的の外れた質問内容でした。一手間、煩わせて申し訳ありません。重ね重ねご指導願えないでしょうか? 宜しくお願い致します。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

vba_minaraiさん、Wendy02です。 >印刷設定のPageSetupで、Orientationには、XlPageOrientation クラスの定数が返されるとあります。 クラスは変数の宣言型とは、違います。クラスというのは、例えば、電気製品(オブジェクト)の中の電波を受信して画像と音声を出す装置を「テレビ」とするというのがクラスにあたります。ただ、それ自体は、実体がありませんね。それを、個別にメーカーとか分かれて、最終的には、自分の手元にある「もの」が、インスタンスということになります。クラスというのは、ある一定の性質を与えた「もの(オブジェクト)」ということです。今回の場合、そのクラスの中に、列挙した定数が置かれているということです。 その組み込み定数自体は、それぞれの型が宣言されていますから、それ自体は、型の宣言は必要ありません。 時々、Excelのオブジェクトブラウザ(VBE 画面で、F2)を利用してみると良いです。私などには、まだ知らないようなことが一杯出てきます。例えば、知っているはずで知らないものには、Rangeオブジェクトがあります。

vba_minarai
質問者

補足

いつも、いつもご指導ありがとう御座います。クラス自体が全く判っていないので、勉強したいのですが、VBAの入門書では、割愛されていてイマイチつかめません。VBの本を読んでみたいと思います。どの分野でも同じだと思うのですが、同じような質問をしても熟練の人から見ると、"この人何も判っていないなぁ?”って感じるものと、中級者から見ると何をいまさらって見られるけど、熟練者からするとこの人物事を凄く理解されているからこんな疑問がわくんだなぁ?ってものがあると思います。以外と、この2者の質問内容って近いものがあったりします。当然、問いただしている内容の本髄は雲泥の差がありますが。Rangeオブジェクトの話で、そのようなことを自分の専門分野で感じたことを思い出しました。Rangeオブジェクトに複数形がないあたりに、エクセルVBAにおけるオブジェクト指向の基本がありそうな気がしています。補足ではありませんが、補足の欄を使用しました。いつも、感服しております。本当にありがとう御座いました。(お礼は、締め切り後も記入が出来るので残しておきます)

  • gatyan
  • ベストアンサー率41% (160/385)
回答No.1

自分の使っているバージョンのヘルプには、『長整数型 (Long) の値』と書かれていますが。 オブジェクトブラウザで検索すると、 Const xlLandscape = 2 のように定義されているようです。

関連するQ&A