お世話になります
イメージを描きやすいように、例を挙げます
Function sample()
  MsgBox("こんにちわ")
End Function

こんな関数をエクセル上で
Visual Basic Editorアイコンを押すと
VBA画面が開きますから、コードを書くところに
上の3行の関数、sample()、を記入します

左のイミディエイトウィンドウ(環境によるかも知れません)

sample(Enterキー)
と入力すると
Sub または Function が定義されていません
と、エラーが出ます
ACCESSのVBAであれば、これで実行できる、とおもいますが
エクセルの場合はどうするのでしょうか

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

A 回答 (4件)

こんにちは。



>ACCESSのVBAであれば、これで実行できる、とおもいますが

>Function sample()
>  MsgBox("こんにちわ")
>End Function

初歩的なことですが、Access は、実際には、コントロール側から、ユーザー定義関数を働かせますが、Excelの場合は、通常は、実行型のプログラムは、ユーザー定義関数ではなく、マクロ型(Sub ~End Sub)にします。もし、Excelで実行型のプログラムが必要な場合は、直接コントロール(例:Sub CommandButton1_Click() ~End Sub)に入れてしまえばよいからです。

また、Excelの場合、Function は、複雑な計算に用いるもので、いわゆる設定させたりする、実行型のプログラムは、静的な空間では、通常は不可能なのです。(それを起動させているのは、通常は、それをサブルーチンにして、Enter や別のプロシージャなどの外部的な命令です。)

したがって、例えば、書式を変えたり、入力させたり、メッセージを出したりというのは、ユーザー定義関数では不可能です。(絶対的ではありまんせが、それは、めったに用いられない裏技です。)

Excel の場合、

なぜ、[イミディエイトウィンドウ]から、そのようなコードを実行しなくてはならないのか、意味が分かりませんが、

Call sample()

とすればよいです。
ただし、そのまま、その関数を実行させるには、標準モジュールに書いてないといけません。

通常は実行型にするためには、以下のようにします。

Sub TestPrc1
   MsgBox "こんにちは"
End Sub

Excel上では、実行型のユーザー定義関数は、なるべく、マクロ型(Sub ~End Sub[引数のない完結型])にした方がよいです。また、Accessからコードを移植する場合は、多少、両方のVBAの知識が必要です。
    • good
    • 1
この回答へのお礼

ありがとうございました
ACCESSとの違いをわかりやすく
していただき、助かりました

お礼日時:2006/12/01 13:30

>Sub または Function が定義されていません



ということはコードが標準モジュールではなくてシートモジュールに書かれているはずです。
VBEのタイトルバーに、Sheet1[コード]などとシート名が表示されてませんか?

シート名が表示されていればそのシートモジュールにコードが書かれているわけですから、
実行する場合は、Sheet名.Procedure名となります。

   Sheet1.Sample  Enterキー

ただ、質問のようなコードは通常「標準モジュール」に書きますから、「標準モジュール」に書けば、質問のように

   Sample  Enterキー

で実行できます。
    • good
    • 0
この回答へのお礼

よくわかりました
実行できました
助かりました

お礼日時:2006/12/01 13:28

#1です。

一つ忘れてた。
イミディエイトウィンドウ上で実行させる場合は
Msgbox sample()
とか
Print sample()
のように結果をどのように処理するか設定すれば確認できます。
    • good
    • 0
この回答へのお礼

ありがとうございました

お礼日時:2006/12/01 13:28

ユーザー定義関数ならセル上で


=sample()
と入力してEnterですね。
でも内容が計算の結果でなくメッセージの表示ならマクロとして登録のうえ
マクロの実行(登録したボタンorショートカットキー)の方がいいのでは?
    • good
    • 0
この回答へのお礼

ありがとうございました

お礼日時:2006/12/01 13:27

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

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

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

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

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

Qエクセルの下記表について答えを導く関数式とは?

 下記のような形式の車種別の生産予定表があるとします。


  A   B  C  D  E  F  G  
1車種 4/1 2  3  4  5  6日  
2車1  20    30 50
3車2     60 80
4車3              40
5車4  50
6車5     40 30   
7車6              70 10台

 のような少ロットで変動の多い生産予定表について
 4月X日の車Xの生産数を知るにはINDEX+MATCH関数、VLOOKUP+MATCH関数で表を縦横に検索すれば交差するセルの台数を返しますが、仮に台数が分かっているとして、逆の論理として
 車1の生産があった日が4月1日、3日、4日であるという生産対象日を返したい。
 4月3日の生産は車1、車2、車5であるという車種名を返したい。

 これを出来るように関数式を考えていますが、上手く答えを出せません。セルに返る戻り値が一つではありません。
一つの関数式では無理なんでしょうか?VBAが分からないので関数で出せると助かるのですが、方法がありましたら、どなたかご教導お願い申し上げます。
 
 
 

 下記のような形式の車種別の生産予定表があるとします。


  A   B  C  D  E  F  G  
1車種 4/1 2  3  4  5  6日  
2車1  20    30 50
3車2     60 80
4車3              40
5車4  50
6車5     40 30   
7車6              70 10台

 のような少ロットで変動の多い生産予定表について
 4月X日の車Xの生産数を知るにはINDEX+MATCH関数、VLOOKUP+MATCH関...続きを読む

Aベストアンサー

既存の関数のみで行う場合、結果は連続した文字列として1個のセルに表示することになります。単純化のため、ご例示のシートをさらにコンパクトにします。カラムが揃わない場合、メモ帳に貼り付けてご覧ください。

*| A|B|C|D|E|
1|  |1|2|3|
2|車1|4|3| |
3|車2|7| | |
4|車3| | |5|
5|

E2に定義
=IF(B2<>"",$B$1&" ","")&IF(C2<>"",$C$1&" ","")&IF(D2<>"",$D$1&" ","")
以下、E4まで下へドラッグ

B5に定義
=IF(B2<>"",$A$2&" ","")&IF(B3<>"",$A$3&" ","")&IF(B4<>"",$A$4&" ","")
以下、D5まで右へドラッグ

結果
*| A|   B|  C|   D|E |
1|  |   1|  2|   3| |
2|車1|   4|  3|    |1 2 |
3|車2|   7|   |   3|1 3 |
4|車3|    |   |   5|3 |
5|  |車1 車2|車1 |車2 車3|  |

実際のシートの縦横の大きさはいかほどでしょうか。「数式バー」で編集可能な文字列の長さには限りがあります。この方法では実用に耐えない場合、VBAマクロでユーザ定義関数を作成しセルでそれを参照するという方法を検討してください。

既存の関数のみで行う場合、結果は連続した文字列として1個のセルに表示することになります。単純化のため、ご例示のシートをさらにコンパクトにします。カラムが揃わない場合、メモ帳に貼り付けてご覧ください。

*| A|B|C|D|E|
1|  |1|2|3|
2|車1|4|3| |
3|車2|7| | |
4|車3| | |5|
5|

E2に定義
=IF(B2<>"",$B$1&" ","")&IF(C2<>"",$C$1&" ","")&IF(D2<>"",$D$1&" ","")
以下、E4まで下へドラッグ

B5に定義
=IF(B2<>"",$A$2&" ","")&IF(B3<>"",$A$3&" ","")&IF(B4...続きを読む

Q<マクロ・VBA> 大きいEnterキーを押してVBA処理

はじめまして。よろしくお願いします。

ワークシートに入力して、
入力内容により色をつけるというVBAを作っています。
Enterキー(大きい方)を押したら
即時情報が更新されるものを作りたいんですが、
大きいEnterキーで更新する方法が分かりません。
どうぞご教授宜しくお願いします。

やりたいこと>>
(1)大きいEnterキーを押してすぐ内容を判定して行に色をつける
(2)行の色は以下の通り
 削除…赤
 変更…薄い黄色
 その他…色はなし

記述>>
【ThisWorkBook】
Private Sub Workbook_Open()
キー定義
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
キー定義の解除
End Sub
--------------------------------------------------
【標準モジュール】
Sub キー定義()
Application.OnKey "{ENTER}", "判定"
End Sub
Sub 判定()
If ActiveWorkbook.Name = "色付けテスト" Then
If ActiveCell.Value = "削除" Then
ActiveCell.EntireRow.Interior.ColorIndex = 3
ElseIf ActiveCell.Value = "変更" Then
ActiveCell.EntireRow.Interior.ColorIndex = 36
Else: ActiveCell.EntireRow.Interior.ColorIndex = xlNone
End If
End If
End Sub

今のところはテンキーのEnterキーで対応しています。
よろしくお願いします。

はじめまして。よろしくお願いします。

ワークシートに入力して、
入力内容により色をつけるというVBAを作っています。
Enterキー(大きい方)を押したら
即時情報が更新されるものを作りたいんですが、
大きいEnterキーで更新する方法が分かりません。
どうぞご教授宜しくお願いします。

やりたいこと>>
(1)大きいEnterキーを押してすぐ内容を判定して行に色をつける
(2)行の色は以下の通り
 削除…赤
 変更…薄い黄色
 その他…色はなし

記述>>
【ThisWorkBook】
Private Sub Workbook_Open(...続きを読む

Aベストアンサー

Application.OnKey "~", "判定"
ということでしょうか?

Qエクセルの関数にて【今日の日付から3ヶ月後の日付を入力する関数とは?】

3ヶ月ごとに更新する契約書を作成しています。
ある日付からちょうど3ヶ月後の一日前が出るような関数を探しています。

例えば、
セルに今日の日付「9月6日」と入れると、そのとなりのセルには契約の切れる「12月5日」が出るようにしたいのですが、うまい具合に出来ません。

GOOの賢人様方、お知恵をお貸しください!

Aベストアンサー

アドインで分析ツールが組み込まれている場合は

=EDATE(A1,3)-1

そうでない場合は

=DATE(YEAR(A1),MONTH(A1)+3,DAY(A1))-1

ただし、11月30日をA1に入力した場合、答えが3月1日になってしまうようです。
(うるう年であれば2月29日となりOK)

QVisual Basic Editorで書けない字

ワークシートには書けます。(コピペですが)
=CHAR(254)で表示もされます。
数式にも文字列で使えます。
でも、Visual Basic Editor ではコピペすると?に化けてしまいます。
VBAコードの中で使用したいのですがどうすればよいのでしょうか?

Aベストアンサー

こんにちは。

  Cells(2, 3) = ChrW(254)
  Cells(2, 4) = ChrW(9745)
とか
  Cells(2, 3) = ChrW(&HFE)
  Cells(2, 4) = ChrW(&H2611)
みたいにも書けますね。

因みに、文字コードを採るには
  MsgBox AscW(Cells(2, 3))
  MsgBox AscW(Cells(2, 4))
とか
  MsgBox "&H" & Hex(AscW(Cells(2, 3)))
  MsgBox "&H" & Hex(AscW(Cells(2, 4)))
とか。

一応、Chr()関数やAsc()関数のヘルプには目を通しておいてください。

QエクセルのSAM関数の「SAM」とは何かの略語なのでしょうか?

エクセルのSAM関数の「SAM」とは何かの略語なのでしょうか?
例えば、MAX関数であれば「MAX」が日本語で「最大値」だと分かります。
「AVERAGE」であれば、「平均」です。
詳しい方がいましたら、宜しくお願い致します。

Aベストアンサー

SUM は、最初、SUMMARY だと私も思っていました。しかし、Summary には、「合計」という意味はなく、要約するという意味です。現在、私自身は、数学用語の、SUMMATION =Σ (総和、合計)という語の省略形だと思っています。

Summation (サメイション) [数学用語]
the total amount or number when two or more things are added together.
[2つまたはそれ以上のものを一緒に加えた時に、その合計値または数値のこと]

ただ、この命名は、Microsoft ともロースタ社とも関係がなく、1970年代の後半、ハーバード大学ビジネススクールの学生、ダンブルックリンらによるもので、彼らはパテントなどの主張も出来ずに、大手の会社に取り入れられてしまい、その時のものが現在まで流用されています。したがって、誰も、その語源に対して主張ができません。

1980年代に、IBMから出ていた表計算の本に、SUM関数の出来た秘話も読んだことがあります。学生さんが、教授が、授業中に何度も黒板を書いたり消したりするのをみて、PCで、できたらと考えたそうです。当時、すでに大型コンピュータには表計算は存在していましたが、PCにはありませんでした。計算範囲の中に、文字列を入れても、エラーを出さずに、合計が出せるという所が、この関数の特徴です。

SUM は、最初、SUMMARY だと私も思っていました。しかし、Summary には、「合計」という意味はなく、要約するという意味です。現在、私自身は、数学用語の、SUMMATION =Σ (総和、合計)という語の省略形だと思っています。

Summation (サメイション) [数学用語]
the total amount or number when two or more things are added together.
[2つまたはそれ以上のものを一緒に加えた時に、その合計値または数値のこと]

ただ、この命名は、Microsoft ともロースタ社とも関係がなく、1970年代の後半、ハーバード大学...続きを読む

QEndモードにしないEndキー

EXCELでEndキーを押すと,ステータスバーに「END」モードの表示が出ます。ENDモードにしないで,アクティブセルと同じ行の一番右端(データの含まれている範囲で)に移動させるにはどうしたら良いのでしょうか?
EXCEL2000です。

Aベストアンサー

こんにちは。

以下のマクロで、試してみて下さい。

Private Sub auto_Open()
Application.OnKey "{END}", "Set_EndColumn"
End Sub
Sub Set_EndColumn()
wRow = ActiveCell.Row
Range("IV" & wRow).End(xlToLeft).Select
End Sub

'マクロ貼付
(1) Alt+F11 (ツール → マクロ → Visual Basic Editor) →「挿入」→「標準モジュール」で表示される画面に貼り付け
(2) Excelを再起動して試しください。

Qエクセル関数で使われる10^10とは何でしょうか。

エクセル関数で使われる10^10とは何でしょうか。

他の教えて!gooで書かれていた数式を用いてデータ取得には成功したのですが
関数の内容が知りたいのでわかるかたお願いします。

参考アドレス: http://oshiete.goo.ne.jp/qa/6085476.html
(以下参照文)
----------------------------------------------------------
例えばA1セルからE1000セルの間で数値の入っている下端のデータであれば次のように作業列を設けて求めることができます。
初めに1行目に新たな行を挿入します。
A1セルには次の式を入力してE1セルまでオートフィルドラッグします。

=MATCH(10^10,A2:A1000)+1

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

上記に出てくる10^10は何を表わしているのでしょうか。。
どうぞよろしくお願いいたします。

Aベストアンサー

10^10とは10の10乗で100億です。

=MATCH(10^10,A2:A1000,1)

100億より小さい数字で最大のものを求めるということで、その表で最大値が決まっていれば、それより大きい数字であれば何でもOKです。

ちなみに、MATCH関数で、照合の型に 1又は省略の場合、昇順になっていない場合、検索値より小さいもので、一番下のものの位置を返します。

QExcel VBA msgboxについて

メッセージボックスを表示させた際
OKボタンや、YES/NOボタン上にポインタを移動させるコードを教えて頂けませんか?

「VBA msgbox ポインタ 移動」などで検索したのですが
どうしてもヒットしませんでした。
どうぞよろしくお願いいたします。

Aベストアンサー

やってみたらできた。が、実用的でないので実験扱いということで。

MsgBox のボタンは Prompt の長さで位置が変動するため、正確に
カーソルを移動したい場合は、Msgbox を表示した後でボタン位置
の座標計算をしなければなりません。デスクトップ解像度でも変化
しそうですね。

ご参考まで。

' // 標準モジュール

Option Explicit

Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long
Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" ( _
    ByVal lpModuleName As String) As Long
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" ( _
    ByVal idHook As Long, _
    ByVal lpfn As Long, _
    ByVal hmod As Long, _
    ByVal dwThreadId As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" ( _
    ByVal hHook As Long) As Long
Private Declare Function CallNextHookEx Lib "user32" ( _
    ByVal hHook As Long, _
    ByVal nCode As Long, _
    ByVal wParam As Long, _
    ByRef lParam As Any) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" ( _
    ByVal hWnd As Long, _
    ByVal lpClassName As String, _
    ByVal nMaxCount As Long) As Long
Private Declare Function GetDlgItem Lib "user32.dll" ( _
    ByVal hDlg As Long, _
    ByVal nIDDlgItem As Long) As Long
Private Declare Function GetWindowRect Lib "user32.dll" ( _
    ByVal hWnd As Long, _
    ByRef lpRect As RECT _
) As Long
Private Declare Function SetCursorPos Lib "user32.dll" ( _
    ByVal x As Long, _
    ByVal y As Long) As Long

Private Type POINTAPI
    x    As Long
    y    As Long
End Type
Private Type RECT
    Left  As Long
    Top   As Long
    Right  As Long
    Bottom As Long
End Type

' // Msgbox Ctrl ID
Public Enum MSGBOXCTRLID
    CTRLID_OK = &H1
    CTRLID_CANCEL = &H2
    CTRLID_ABORT = &H3
    CTRLID_RETRY = &H4
    CTRLID_IGNORE = &H5
    CTRLID_YES = &H6
    CTRLID_NO = &H7
End Enum

Private Const MAX_PATH As Long = 256
Private Const WH_CBT = 5
Private Const HCBT_ACTIVATE = 5
Private Const HC_ACTION = 0

Private hHook    As Long
Private mlMoveCurPos As Long

' // カーソル移動機能(InteliPoint の SnapItもどき)
' // のあるメッセージボックス関数
Public Function MsgboxEx( _
    ByVal Prompt As String, _
    Optional ByVal Buttons As VbMsgBoxStyle = vbOKOnly, _
    Optional ByVal Title As String = "Microsoft Excel", _
    Optional ByVal MoveCurPos As MSGBOXCTRLID = 0 _
) As VbMsgBoxResult

  Dim hModule As Long
  Dim ThreadID As Long
  
  ThreadID = GetCurrentThreadId()
  hModule = GetModuleHandle(vbNullString)
  mlMoveCurPos = MoveCurPos
  hHook = SetWindowsHookEx(WH_CBT, _
               AddressOf MsgboxHookProc, _
               hModule, _
               ThreadID)
  MsgboxEx = MsgBox(Prompt, Buttons, Title)
  UnhookWindowsHookEx hHook

End Function

' // CallBack
Private Function MsgboxHookProc( _
    ByVal nCode As Long, _
    ByVal wParam As Long, _
    ByVal lParam As Long _
) As Long
  
  Dim lReturn  As Long
  Dim sClassName As String
  Dim hWnd    As Long
  Dim uRect   As RECT
  Dim x     As Long
  Dim y     As Long
  
  If nCode < HC_ACTION Then
    MsgboxHookProc = CallNextHookEx(hHook, nCode, wParam, lParam)
    Exit Function
  End If
  
  sClassName = Space$(MAX_PATH)
  
  If nCode = HCBT_ACTIVATE Then
    lReturn = GetClassName(wParam, sClassName, Len(sClassName))
    ' // Dialog Class Name:= #32770
    If Left$(sClassName, lReturn) = "#32770" Then
      ' // 目的ボタンのハンドルを取得する.引数の指定ミス等でハンドル
      ' // 取得に失敗したら Msgbox のウインドウハンドルに置き換え
      hWnd = GetDlgItem(wParam, mlMoveCurPos)
      If Not hWnd > 0 Then
        hWnd = wParam
      End If
      ' // 取得したハンドルのボタン(またはウインドウ)の中央
      ' // スクリーン座標を求めて、カーソルを移動させる
      Call GetWindowRect(hWnd, uRect)
      With uRect
         x = .Left + Int((.Right - .Left) / 2)
         y = .Top + Int((.Bottom - .Top) / 2)
      End With
      Call SetCursorPos(x, y)
    End If
  End If
  
  CallNextHookEx hHook, nCode, wParam, lParam

End Function


' // 使い方のサンプルコード(動作確認用)
Sub Sample()
  
  Dim iRes  As Integer
  Dim sPrompt As String
  
  ' // テスト用に長いプロンプトを用意
  sPrompt = String$(500, "あ")
  ' // メッセージボックス表示
  iRes = MsgboxEx(sPrompt, _
          vbYesNoCancel + vbDefaultButton3 + vbQuestion, _
          "テストです", CTRLID_CANCEL)
  Select Case iRes
    Case vbYes:  MsgboxEx "Press Yes Button.", , , CTRLID_OK
    Case vbNo:   MsgboxEx "Press No Button.", , , CTRLID_OK
    Case vbCancel: MsgboxEx "Press Cancel Button.", , , CTRLID_OK
  End Select
  
End Sub

やってみたらできた。が、実用的でないので実験扱いということで。

MsgBox のボタンは Prompt の長さで位置が変動するため、正確に
カーソルを移動したい場合は、Msgbox を表示した後でボタン位置
の座標計算をしなければなりません。デスクトップ解像度でも変化
しそうですね。

ご参考まで。

' // 標準モジュール

Option Explicit

Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long
Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA"...続きを読む

Qワークシート関数とはどのことなのですか?

【1】エクセルのワークシート上で使う=TODAY()などの関数

【2】VBAのCountなどのWorksheetFunction

【3】VBAのLENなどの関数

どれのことを俗に言う「ワークシート関数」と言うのでしょうか?
VBAで使う【2】【3】のことですか?

Aベストアンサー

ワークシート上で使う関数のこと。つまり1です。

QエクセルVBAのMsgBox関数について

エクセルVBAのMsgBox関数で項目1と項目2の値を表示して
問題なければデータベースに登録するといったコードを作りたいです。
今のところ以下のような感じです。
MsgBox("項目1" & 項目1.Value & vbCrLf & "項目2" & 項目2 & vbCrLf &
"以上の内容で登録してよろしいですか?", 36 + 256, "確認,")
これでは
項目1XXXX (XXXX 項目1の値)
項目2XXXX (XXXX 項目2の値)
以上の内容で登録してよろしいですか?
のように表示され、項目1と項目1の値の間にスペースがないため
見栄えが悪いです。そこでスペースを表示して、尚且つ項目1の値と
項目2の値を右端を揃えて表示したいのですが、文字数が不定なので
スペースを決まった数入力すれば解決するということではありません。
誰かVBAに詳しい方、ご教授願えませんでしょうか。

Aベストアンサー

MSGBOXには「右寄せ」の指定はありませんし、そもそも表示フォントも
システムフォント指定でプロポーショナルフォントですから、ブランク
を入れて文字位置を合わせるなんてことも出来ません。

(まあ、全角文字を指定してRIGHT/LEFT関数を駆使すれば、それっぽく
なることはなりますが・・・)

ということで、表示位置をしっかり合わせたいなら、表示専用にフォーム
を作って、テキストボックスのプロパティを使うしかないと思います。


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

人気Q&Aランキング

おすすめ情報