TopProgramming LanguageVB/VBA > 2014年7月
2014年7月31日

VBAで「定数、固定長文字列、配列、ユーザー定義型文字列、およびDeclareステートメントは、オブジェクトモジュールのパブリックメンバとしては使用できません。」というエラーの原因と対処のまとめ

July 31,2014 2:22 AM
Tag:[, ]
Permalink

VBAで「定数、固定長文字列、配列、ユーザー定義型文字列、およびDeclareステートメントは、オブジェクトモジュールのパブリックメンバとしては使用できません。」というエラーの原因と対処方法についてまとめましたので、本エントリーで紹介します。

1.エラーが発生したケース

Excel VBAで文字入力後の左矢印キーでセルを移動させないマクロ」で紹介したコード(下記)の動作確認時、当初は図に示す「Misosoft Excel Object」→「Sheet1」に追加していました。

VBE

追加したコードは下記です。

Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
 
Function Check_input_key(key As Integer)
    If GetAsyncKeyState(key) <> 0 Then
        Check_input_key = 1
    Else
        Check_input_key = 0
    End If
End Function
 
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim result As Integer
    result = Check_input_key(37)
    If result = 1 Then
        Range(Target.Address).Activate
        SendKeys "{F2}"
    End If
End Sub

追加後、「Sheet1」シート上の任意のセルに文字を入力して左矢印キーを押下したところ、「定数、固定長文字列、配列、ユーザー定義型文字列、およびDeclareステートメントは、オブジェクトモジュールのパブリックメンバとしては使用できません。」というエラーが発生しました。

定数、固定長文字列、配列、ユーザー定義型文字列、およびDeclareステートメントは、オブジェクトモジュールのパブリックメンバとしては使用できません。

2.原因

原因はダイアログに記されているとおり、Declare文をワークシートに記述したためです。

3.対処

VBEの「挿入」→「標準モジュール」を選択して標準モジュールを追加し、Declare文を標準モジュールに移動することでこのエラーは解消しました。

VBE

なお、GetAsyncKeyState()を利用する関数(上記のサンプルであればCheck_input_key())は標準モジュールに移動しなくても動作します。

次に、このエラーが発生する原因などについて言及したいと思います。

4.オブジェクトモジュールとは?

エラーメッセージに含まれる「オブジェクトモジュール」とは、標準モジュール以外のモジュール、

  • Misosoft Excel Object
  • クラスモジュール

を指すものと思われます(図の赤枠部分)。

VBE

つまり、赤枠で示したモジュールではエラーメッセージに表示された条件のパブリックメンバが定義できないということになります(すべてのパブリックメンバが定義できないという意味ではありません)。

5.パブリックメンバとは?

「パブリックメンバ」とは「Public」で宣言された変数を指します。

Public foo As Integer

Publicで宣言された変数は、プロジェクト内にあるすべてのモジュールから参照することができます。

これとは逆に「プライベートメンバ」というものがあり、これは「Private」で宣言された変数を指します。

Private bar As Integer

Private宣言した変数は、宣言したモジュール内からのみ参照できます。「Private」は「Dim」と同じ意味です。

Dim bar As Integer

なお、ユーザ定義型はデフォルトでPublicとなります。

たとえば、次のユーザ定義型、

Type Sample
    a As String
    b As Integer
End Type

は、

Public Type Sample
    a As String
    b As Integer
End Type

と同じ意味になります。

6.エラーが発生するすべてのケース

エラーメッセージに記載されている、

  • 定数
  • 固定長文字列
  • 配列
  • ユーザー定義型
  • Declareステートメント

での具体的なエラー発生ケースを確認してみました。

ワークシートやクラスモジュールなどのオブジェクトモジュールに次の内容を記述するとエラーが発生します。

定数

Public Const foo = "bar"

固定長文字列

Public foo As String * 20

配列

Public foo() As Integer

ユーザ定義型

Type Sample
    a As String
    b As Integer
End Type

Declareステートメント

Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

定数・固定長文字列はVBE編集時に、配列・ユーザ定義型・Declareステートメントは実行時にこのエラーメッセージが表示されます。

なお、ユーザ定義型で試したところ、「オブジェクトモジュール内では、パブリックユーザー定義型は定義できません」というエラーになり、同様のエラーメッセージになりませんでした。

オブジェクトモジュール内では、パブリックユーザー定義型は定義できません

7.すべてのケースの対処方法

対処方法は、6項のコードを標準モジュールに記述するか、Publicである必要がなければPrivate宣言すればOKです。

特にユーザ定義型はデフォルトでPublicとなるので、オブジェクトモジュールで利用したい場合はPrivate宣言すればよいでしょう。

Private Type Sample
    a As String
    b As Integer
End Type
Comments [0] | Trackbacks [0]
2014年7月14日

Excel VBAで文字入力後の左矢印キーでセルを移動させないマクロ

July 14,2014 12:55 AM
Tag:[, ]
Permalink

Excel VBAで文字入力後の左矢印キーでセルを移動させないVBAマクロを作ってみました。

1.はじめに

先日「Excelで文字入力後の矢印キーでセルを移動させない方法」という記事をエントリーしましたが、VBAで同じようなことが実現できないか色々調べてみたところ、近い動作ができることが分かったのでマクロにしてみました。

2.各シートのコード

各ワークシートのコードに以下を追加します。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim result As Integer
    result = Check_input_key(37)
    If result = 1 Then
        Range(Target.Address).Activate
        SendKeys "{F2}"
    End If
End Sub

3.標準モジュール

標準モジュールに下記の内容を追加します。

Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Integer
 
Function Check_input_key(key As Integer)
    If GetAsyncKeyState(key) <> 0 Then
        Check_input_key = 1
    Else
        Check_input_key = 0
    End If
End Function

これでセルに文字を入力したあとで左矢印キーを押下すると、セル内でカーソルを移動することができるようになります。

厳密には1回目の左矢印キー押下ではカーソルは移動せず、2回目の左矢印キー押下でカーソルが移動します。

4.参考サイト

参考サイトは下記です。ありがとうございました。

Comments [0] | Trackbacks [0]
2014年7月 7日

Excelファイルを開くとき・閉じるときにVBAを実行する方法

July 7,2014 2:55 AM
Tag:[, ]
Permalink

Excelファイルを開くとき・閉じるときにVBAを実行する方法を紹介します。

1.問題点

VBAを起動するには、通常、「開発」→「挿入」でフォームコントロールやActiveXコントロールのボタンを設置し、それをクリックなどすればOKです。

挿入

あるいは「Excelでセルのダブルクリックや右クリックでVBAを起動する方法」で紹介したイベントをハンドリングする方法があります。

が、Excelファイルを開いたときにVBAを実行する方法が分かりません。

2.Excelファイルを開いたときにVBAを実行する

Excelファイルを開いたときにVBAを実行するには、Auto_Open()を利用します。

具体的には、標準モジュールに次の内容を設定します。

Sub Auto_Open()
  MsgBox "Open"
End Sub

このマクロを記述したファイルを一旦閉じて開くと、次のダイアログが表示されます。

ファイルを開いたときのダイアログ

3.Excelファイルを閉じたときにVBAを実行する

Excelファイルを開いたときにVBAを実行するには、Auto_Close()を利用します。

具体的には、標準モジュールに次の内容を設定します。

Sub Auto_Close()
  MsgBox "Close"
End Sub

このマクロを記述したファイルを閉じると、ファイルが閉じられる前に次のダイアログが表示されます。

ファイルが閉じられる前のダイアログ

Comments [0] | Trackbacks [0]
2014年7月 4日

Excelでセルのダブルクリックや右クリックでVBAを起動する方法

July 4,2014 12:55 AM
Tag:[, ]
Permalink

Excelのセルのダブルクリックや右クリックでVBAを起動する方法を紹介します。

1.問題点

VBAを起動するには、通常、「開発」→「挿入」でフォームコントロールやActiveXコントロールのボタンを設置し、それをクリックなどすればOKです。

開発メニュー

が、セルのダブルクリックや右クリックでVBAを起動する方法がわかりません。

2.ダブルクリックや右クリックでVBAを起動する

ここではダブルクリックでVBAを起動する方法を例に説明します。右クリックの場合も手順は同じです。

ダブルクリックや右クリックでVBAを起動するには、まずAlt+F11でVBEを起動します。

VBE

「Sheet1」シートでの操作を対象にする場合、左ツリーの「Sheet1」をダブルクリック。

VBE

「Sheet1」の入力画面が開くので、入力エリア上部にある「(General)」から「Worksheet」を選択。

VBE

メソッドのひながた(今回は使用しません)が自動入力されると同時に、さきほどの右隣にあるプルダウンが「SelectionChange」になります。

VBE

「SelectionChange」から「BeforeDoubleClick」を選択。右クリックの場合は「BeforeRightClick」を選択してください。

VBE

これで次のコードが自動入力されます。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 
End Sub

これで「Sheet1」シートのセルをダブルクリックすると、この関数Worksheet_BeforeDoubleClick()が起動します。

第1パラメータのTargetはダブルクリックしたセルの座標です。

次のように記述すればダブルクリックした座標を出力します。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    MsgBox Target.Address
End Sub

第2パラメータのCancelは、ダブルクリックイベントしたときにセルにカーソルが入った状態にするかどうかを決めます。

下記のよう「True」を設定にすれば、ダブルクリックをしてもセル内にカーソルが入りません。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Cancel = True
End Sub

デフォルト値はFalseなので、セル内にカーソルが入ってよければ、

Cansel = False

を記述する必要はありません。

2.他のイベントについて

本エントリーではダブルクリックや右クリックでVBAを起動する方法を紹介しましたが、他にもいろいろなイベントが用意されていますので試してみるとよいでしょう。

Comments [0] | Trackbacks [0]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3