EXCELマクロについての不明点

このQ&Aのポイント
  • EXCELのマクロについての不明点についてまとめました。具体的な質問内容は以下の通りです。『「show」は何の操作か?』『また、「test」とは何を指すものか?』『As list のlistとは何か?』『draht=test.suchtest(Val1,Typ)は何が異なるのか?』
  • EXCELのマクロについての不明点についてまとめました。具体的な質問内容は以下の通りです。「show」は何の操作か?」「「test」とは何を指すものか?」「As list のlistとは何か?」「draht=test.suchtest(Val1,Typ)は何が異なるのか?」
  • EXCELのマクロについての不明点についてまとめました。質問内容を簡潔にまとめると、「「show」は何の操作か?」、「「test」とは何を指すものか?」、「As list のlistとは何か?」、「draht=test.suchtest(Val1,Typ)は何が異なるのか?」です。
回答を見る
  • ベストアンサー

EXCELのマクロについて

以下のプロシージャの内容が理解出来ません。 Public Sub test() test.show End Sub Public Function te2(ByVal Val1 As Single, Typ As String) As list シート1の名前.Activate draht=test.suchtest(Val1,Typ) End Function 不明点は以下の通りです。 ・「show」は何の操作か?(関数でしょうか?) ・また、「test」とは何を指すものか?  プロジェクト中には上記ステートメント以外で「test」の記載は  有りません。また、シート名ではなく、セル範囲の名前でも無い  ようです。何か他のものでしょうか? ・As list のlistとは何か?  関数のデータ型を記載する場所にユーザが付けたと思われる名前を記 載して何故マクロが動くのか? ・draht=test.suchtest(Val1,Typ)は何が異なるのか?

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

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

こんにちは。 ドイツ語圏のもののようです。コードの一部を出されて、後は想像してください、というようなものですから、ちょっと不可能に近いですね。 >・「show」は何の操作か?(関数でしょうか?) >・また、「test」とは何を指すものか? 通常は、UserForm などのダイアログ型のオブジェクトに Show をつけますが、この場合は、Classで、testに show というプロパティを加えたのではないかと思います。しかし、もし、そうなら、あまりうまくありませんね。メソッドのShowと名称がぶつかるので、たとえ、支障がなくても、かなり読みにくいです。 > 関数のデータ型を記載する場所にユーザが付けたと思われる名前を記載して何故マクロが動くのか? 構造体にすればよいのではいいと思います。ただ、実際は、Cで動かすにしても、VBAでは、こういう書き方は趣味に近いというか、Public Function にして、戻り値を構造体にしたところで、あまり意味がないような気がします。(全体が見えていないので分かりませんが、VBAの場合は、この呼び出しにPublic ステートメントの必要性がわからないです。) draht が、list というユーザー定義型ということですが、その変数のスコープが、モジュールレベルなのか、グローバルレベルかの変数を置いているわけです。 だからどうなんだ、ということになるのですが、肝心なコードが抜けているので、それは分かりません。Declare で呼び出すのか、それとも、参照設定で呼び出すのか、それとも、Class に登録してあるのか、いずれかにプログラムが別に存在しています。

speeduge
質問者

お礼

御回答ありがとうございます。drahtの部分でドイツ語圏のモノと考えられたのでしょうか?日本とドイツでは関数の名前などVBAに違いがあるのでしょうか?(非常に初歩的な質問ですみません…) お手数ですが、別プログラムの探し方を少しだけ具体的に教えていただけないでしょうか?  ・declareで探す方法 ・参照設定で探す方法  ・Class登録で探す方法

その他の回答 (6)

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

こんにちは。 >最後に確認なのですが(不安なので…)、 >te2 = test.suchtest(Val1, Typ)の意味は >「testフォーム中のsuchtest(構造体)をte2(構造体)へ代入する」という構造体の受渡>しという理解で良いでしょうか? そうなのですね。普通は、参照渡しされることもあるようです。 両方が受け入れる要素を持っているので、受け渡しが可能です。 >構造体は内部に複数の要素を持つ、1つのデータの集まりなのですね。 それぞれが独立しているわけですが、ひとつの処理をするときに、失っては困る場合です。 最近、典型的な構造体のサンプルをお見せします。2番目のが本当の意味の構造体(C言語の用語)です。VBA/VBでは、正式には、データ型(Long,Integer,String)の中の「ユーザー定義型」と呼んでいます。この定義型の有効性、必ず、まとまって使われる変数の場合に、一旦定義しておけば、インテリセンスが働き、変数の後に、「.(カンマ)」を入れると」項目が出てきますので、入れ忘れるという心配がありません。 VBAのユーザー定義型 '標準モジュール Type Profile  名前 As String  住所 As String  年齢 As Integer  性別 As Boolean  電話番号 As Long End Type Sub Test()  Dim Person As Profile End Sub のように使います。 C言語から、Win32 APIで使用する場合 http://oshiete1.goo.ne.jp/kotaeru.php3?qid=3972323 QNo.3972323 WORDのマクロについて質問です #3 で書かれている Type OPENFILENAME   |   | End Type ここに書かれているのをごらんになると分かるのですが、実は、「省略」出来ないような仕組みになっているので、コードが大げさになってしまっています。 それが、旧VB/VBAで、一般的に目にする構造体の使い方です。後になって失敗に気がついたのは、Word には、Dialogs オブジェクトで同様のものがあるのを、書いたときには思いつきませんでした。 なお、今回、最初、クラスのプロパティ設定かと思いましたが、UserForm 上でしたので、違いましたが、コードとしては、そっくり同じにようになります。最初、それで作ってみたのですが、途中で、違うということが分かりました。

speeduge
質問者

お礼

丁寧な回答ありがとうございました。VBAのコードを解読しはじめた時は、VBAを全く知らないにも関わらず、英語と一緒で辞書を引いて順に読んでいけば簡単に理解出来ると考えていました。それが、読み始めてみると、どれが予約語で、どれがユーザが付けた名前なのか分からず、辞書を引く=検索するという事がなかなか難しかったです。今は、コードを選択してF2キーというのを覚えて少しはましになりましたが…。wendy02さんのおかげで助かりました。ありがとうございました。

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

こんにちは。 通常、VBAでは、変数を構造体にして代入ということをしません。VBAとしては奇妙なコードかもしれませんね。説明は、ちょっと絵を書かないと理解しにくいです。VBAだけなら、絶対に出会わないコードかもしれません。私個人のVBAのレベルでは、こういう変数の扱いはしたことがありません。通常、列挙型の定数までは作りますが、それ以上の規模になるものを作りません。 構造体は多次元配列に似ていますが、多次元配列では、その変数全体のデータ型に影響されますので、データ型が統一しない場合は、Variant 型しか指定しません。したがって、個別の要素を設定することが出来ません。 >構造体要素のVal1とtypへ値を代入していると考えるべきなのでしょうか? 構造体になった変数、ret に対して、それぞれの要素の Val1, type に代入しています。 ret.Val1 = TextBox1.Value  '←個別のretのVal1 に入れる ret.Typ = TextBox2.Value  '←個別のret のTyp に入れる '●ここで、 ret2 = te2(ret.Val1, ret.Typ)  'ここに渡しています。 'Public Function te2(ByVal Val1 As Single, Typ As String) As list ' そして、出てきた戻り値を、構造体になっている ret2 に出しています。その戻り値は、やはり、構造体の内容になっています。だから、要素が取れます。 >TextBox1.Value = ret2.Val1 >TextBox2.Value = ret2.Typ また、以下コードのsuchtest=retでは、retに要素名が付属してないのは何故でしょうか? >Dim ret As list '←構造体 >suchtest = ret >End Function Function suchtest(ByVal Val1 As Single, ByVal Typ As String) As list suchtest も、As list と構造体にしてあります。(=ユーザー定義変数) だから、 同じ、構造体の形式ですから、suchtest = ret と、そのまま渡せます。 うまく説明できているでしょうか。分からないようでしたら、私の説明がうまくないのだと思います。

speeduge
質問者

お礼

おはようございます。 構造体が「構造体」と呼ばれる理由がやっと分かった気がします。 構造体は内部に複数の要素を持つ、1つのデータの集まりなのですね。 構造体が分かるとWendy02さんのサンプルコードも理解出来ました。 最後に確認なのですが(不安なので…)、 te2 = test.suchtest(Val1, Typ)の意味は 「testフォーム中のsuchtest(構造体)をte2(構造体)へ代入する」という構造体の受渡しという理解で良いでしょうか?

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

こんばんは。 とりあえず、この返事から。 >不特定多数の人に出す場合は、プログラム内容を隠す為に、わざと分かりにくい構造にするという事でしょうか? らしいですね。(^^;  たかが、VBAというか、コンパイルそのものはあっても、ビルドがないVBAで、そんな必要性があるのだろうかなって思いましたね。VBAで、そこまでする理由が、私にも良く分からないのです。ただ、VBA上級(エキスパート試験のプロフェッショナル・レベル)には、そういう項目が出てきます。今回よりも、もうちょっと複雑ですが。 >If TextBox1.Value = "" Or TextBox2.Value = "" Then >→""を2個連続しているのは? クォーテーション「""」のことでしょうか? TextBox の値が、「""」何もないという意味なのですが、これを、VBAでは、「長さ0の文字列」と呼びます。 以下は、専門的ですが、別に、「値0の文字列」というものもありますが、VBAではあまり使われません。他にも「Null」というものがありますが、これは、「Null値」(ヌルチ)と呼んで、これは別の値です。「Null文字」というのが、「値0の文字列」のことです。 Excelユーザーの方は、ほとんど混乱しているか、誤解している方が多いのは、ワークシートには、Null という意味が違う意味で使われているからです。 >MsgBox "both TextBoxes have to be filled", 48 >→48の役割は? 48は、 vbCritical  16 vbQuestion  32 vbExclamation  48  ←ここ vbInformation  64 >If IsNumeric(TextBox1.Value) Then >→「TextBox1の値が数字ならば」という事でしょうか? >If Not IsNumeric(TextBox2.Value) Then >→「TextBox1の値が数字でないならば」という事でしょうか? そのとおりです。IsNumeric を使う理由は、TextBox 自体は、元々、Textベースだから、数字でも、数値でも同じことだということです。厳密な数値を求める場合には、この方法は使いません。 >ret.Typ = String(Int(Len(Typ) * 1.5), Left(StrConv(Typ, vbUpperCase), 1)) >→どういう内容でしょうか? list の構造体のひとつに、アルファベットを大文字にして、その文字の数を1.5 倍して、小数点を切り捨てた数だけ出せという意味です。あまり深い意味はありません。 >te2 = test.suchtest(Val1, Typ) >→最終的に本コードはどのような操作を意味してるのでしょうか? TextBox1 の数値は、10倍に、TextBox2 の文字列は、大文字にして、1.5倍した、端数切捨ての数を表示するのですが、これは、関数の解の戻り値を構造体にして、そのまま構造体のまま受け渡しできるように作ったのです。 本来の操作とは違うでしょうけれども、値の受け渡しのテクニックとしては、こういうものを使っているというだけです。VBAでは、このようなワザは、あまり使われません。

speeduge
質問者

お礼

返事が遅くなり、すみませんでした。サンプルコードでさえ読むのに苦労しています(苦笑)。どうも渡しは構造体の使い方がいまいち分かっていないようです。 以下のコードは、各々変数retへtextboxの値を代入していると考えるべきなのでしょうか?それとも構造体要素のVal1とtypへ値を代入していると考えるべきなのでしょうか?私は構造体は前者の働き方をすると考えていたのですが、それだとTextbox1とTextbox2の値が両方ともretの中へ代入されてしまい、つじつまが合いません。これはどのように考えるべきなのでしょうか?  If IsNumeric(TextBox1.Value) Then ret.Val1 = TextBox1.Value Else MsgBox "Textbox1 should be put in numbers"  End If  If Not IsNumeric(TextBox2.Value) Then ret.Typ = TextBox2.Value Else MsgBox "Textbox2 should be put in text(alphabetical)"  End If また、上記の内容が理解出来ていないため、下記コードも良く分かりません。  ret2 = te2(ret.Val1, ret.Typ) TextBox1.Value = ret2.Val1 TextBox2.Value = ret2.Typ また、以下コードのsuchtest=retでは、retに要素名が付属してないのは何故でしょうか? Dim ret As list ret.Val1 = Val1 * 10 ret.Typ = String(Int(Len(Typ) * 1.5), Left(StrConv(Typ, vbUpperCase), 1)) suchtest = ret End Function 御教授お願い致します。

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

こんばんは。 >1.te2がシートのオブジェクトモジュールにそのまま記載されず、 >  標準モジュールにわざわざ記載されている理由。 しばらく考えて、サンプル・コード化してみました。実際のコードとは違うものの、この仕組みは、一種のカプセル化だと思います。 カプセル化というのは、「オブジェクトにして、オブジェクト内の細かい仕様や構造を外部から隠蔽すること」で、今回は、オブジェクトになっているのかは分かりませんが、少なくとも、一旦、標準モジュールに送り、再び、UserForm モジュールによって、その仕組みを見えなくしているのではないか、と思います。 >te2=test.suchtest(Val1,Typ)は、ユーザ関数=フォーム.ユーザ関数の形だがどういう内容か? コードを見たわけではないので、それ自体の内容はわかりませんが、例えば、以下のようにすれば、そのようなコードとして現れます。 以下は、簡易型です。もしかしたら、もう一段、組み込みされているかもしれません。私は、こういう作り方は、めったにしないのは、不特定多数の人に出すことがないからです。 以下は、TextBox1 には、数字を入れ、TextBox2 には、文字(アルファベット)を入れると、それが変化します。 '---------------------------------- 'test Module(UserForm モジュールへ) '---------------------------------- Private Sub CommandButton1_Click()   Dim ret As list   Dim ret2 As list   If TextBox1.Value = "" Or TextBox2.Value = "" Then     MsgBox "both TextBoxes have to be filled", 48     Exit Sub   End If   If IsNumeric(TextBox1.Value) Then     ret.Val1 = TextBox1.Value   Else     MsgBox "Textbox1 should be put in numbers"   End If   If Not IsNumeric(TextBox2.Value) Then     ret.Typ = TextBox2.Value   Else     MsgBox "Textbox2 should be put in text(alphabetical)"   End If   ret2 = te2(ret.Val1, ret.Typ)   TextBox1.Value = ret2.Val1   TextBox2.Value = ret2.Typ End Sub Function suchtest(ByVal Val1 As Single, ByVal Typ As String) As list 'これをClass に入れることも可能 Dim ret As list   ret.Val1 = Val1 * 10   ret.Typ = String(Int(Len(Typ) * 1.5), Left(StrConv(Typ, vbUpperCase), 1))   suchtest = ret End Function '---------------------------------- General module(標準モジュールへ) '---------------------------------- Public Type list  Val1 As Single  Typ As String End Type Public Function te2(ByVal Val1 As Single, Typ As String) As list  Sheets(1).Activate  te2 = test.suchtest(Val1, Typ) End Function

speeduge
質問者

お礼

返事が遅くなってすみません。サンプルコードまで作成して下さって本当にありがとうございます。ただ、サンプルコードもまだ理解出来ていませんので、これから頑張って読ませて頂きます(苦笑)。 また「私は、こういう作り方は、めったにしないのは、不特定多数の人に出すことがないからです」とはどういう事でしょうか?不特定多数の人に出す場合は、プログラム内容を隠す為に、わざと分かりにくい構造にするという事でしょうか? 以下はコードで良く分からなかった点です。よろしければご教授下さい。 If TextBox1.Value = "" Or TextBox2.Value = "" Then →""を2個連続しているのは? MsgBox "both TextBoxes have to be filled", 48 →48の役割は? If IsNumeric(TextBox1.Value) Then →「TextBox1の値が数字ならば」という事でしょうか? If Not IsNumeric(TextBox2.Value) Then →「TextBox1の値が数字でないならば」という事でしょうか? ret.Typ = String(Int(Len(Typ) * 1.5), Left(StrConv(Typ, vbUpperCase), 1)) →どういう内容でしょうか?(自分でも調べてみます)。 te2 = test.suchtest(Val1, Typ) →最終的に本コードはどのような操作を意味してるのでしょうか? もしかすると質問し過ぎているかも知れません。気が向くところだけでもお答え頂ければと思います。

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

補足です。 早い話、それを再現したほうが早いでしょうね。 ただ、 te2 test.suchtest は、どのような働きをしているのでしょうか? 可能なら、こちらで、Class -Instanceで、同じようなものを作ってみたいと思います。複雑な動きをしているとしたら、おそらくは、VBAではないと思います。理由は、VBAでは、Cに比べて、100倍以上遅いからです。それでも、1秒以内には答えは出るはずですが。

speeduge
質問者

お礼

御回答ありがとう御座います。また、同様の動作をするコード作成の提案本当にありがとう御座います。自分なりに調べてみて以下のような事がわかりました。 1.testはユーザフォームの名前であり、test.showは最初のご回答の中で触れられていた通り、ユーザフォームの表示を行うコードでした。   *「フォーム」の存在を知らず、フォーム名を確認していませんでした。 2.te2はシートのオブジェクトモジュールから呼び出しを受けているユーザ関数。 3.suchtestはフォームのオブジェクトモジュール中で定義されているユーザ関数。 残りの不明点として以下の内容が残っていますので引き続き調べます。 1.te2がシートのオブジェクトモジュールにそのまま記載されず、   標準モジュールにわざわざ記載されている理由。 2.te2=test.suchtest(Val1,Typ)は、ユーザ関数=フォーム.ユーザ関数の形だがどういう内容か?(*draht=test.suchtest(Val1,Typ)は記載誤りでした。すみません) ご助言/ご指摘等有れば、お願い致します。2番目はsuchtestの中身を記載していないので答えようがないと思いますが、もし構文の形etcで気になる点有ればお願いします。 マクロ/VBAは全く経験がないので、ちょっとした一言でもヒントになります。 また、質問投稿後もうしわけありませんが、5/4まで所用があり返事が出来ないと思います。ご了承下さい。

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

こんばんは。  独     英 suchtest > search draht > code ですね。 >日本とドイツでは関数の名前などVBAに違いがある違いがあるのでしょうか? VBA自体の仕様にはないはずですが、ユーザー設定で付けるプロパティ名の設定では、私たちは概ね、英語を使いますが、ドイツ人でしたら、ドイツ語にしてもよいでしょうね。 ところで、もしも、アドインでプロテクトを掛けられていたら、中身を見ることは出来ませんが、VB Editor 内のプロジェクトウィンドウから、探してもらうしかありません。  ・declareで探す方法 は、編集-検索-検索する文字列 で、declare カレントプロジェクト それで、呼び出されているか? ・参照設定で探す方法 参照設定で、チェックの入ったもので、らしい名称を探します。 当然、.dll という名称になっているとは思います。 以上の二つは、コンパイルしていますから、中身が見れません。  ・Class登録で探す方法 プロジェクトウィンドウから、Class モジュールの中を探します。 ただ、アドインの場合は、プロテクトが掛かっていたら見れませんね。 おそらく、そこには、標準モジュール(General Module) 内に以下のようなコードがあるはずです。 Public Type list  Val1 As Single  Typ As String End Type Public suchtest As list なお、あまり、際立って特別な方法をしているわけではないのですが、VBAでは、あまり、こういうような作り方をしないだけです。

関連するQ&A

  • エクセルのマクロでクラスのプロパティについて

    エクセルでセルがダブルクリックされたら フォームを表示し、フォーム内のリストボックス のクリック時の値をクラスのプロパティに実装 できるのでしょうか? 以前、仕事でそのようなクラスを呼び出して 使ったことがあるので。 エクセル側 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim cls As New Class1 ' cls.ListSet ' End Sub ↑フォームの表示まで クラスモジュール Option Explicit Public listVal As String Public Function ListSet() As Boolean ' On Error GoTo ErrFunc ' ListSet = True ' With UserForm1 With .ListBox1 .AddItem "a" .AddItem "b" .AddItem "c" End With ' .Show ' End With ' Exit Function ' ErrFunc: ListSet = False End Function Public Property Let val(ByVal data As String) listVal = data End Property Public Property Get val() As String val = listVal End Property フォーム側のListBox1_Clickで どうすればよいか分からなくなりました。 根本的に間違っているのでしょうか? ネットでさがしたのですが参考になる サイトが見つかりません。 解決方法、宜しくお願い致します。

  • エクセルのマクロについて教えていただきたいのですが・・・

    見積書を作成しているんですが、1枚目のシート(見積書)に明細が書ききれなかった時に、マクロを実行すると、『明細書』と言う名前のシートが(1)~(5)枚目まで追加され、各シートの小計を1枚目のシートに書き出す・・・と言うマクロを作りたいのですが、うまくいかずに困っています>< 追加されるシートの元となる『見積もりマスター』と言うシートがあって、そのシート内でそれぞれのシートの小計は取れるのですが・・・ 下記のマクロの中に何か追加すればうまくいく方法はありますか?? (明細書は追加する時もあれば追加しない時もあってその都度、使う人が、最大5枚まで何枚追加するかを決めるそうです。) Sub Macro1() Dim cnt As Integer Dim wkNum As Double Dim ws As Worksheet  For Each ws In Worksheets   If Left(ws.Name, 4) = "明細書(" Then    If IsNumeric(Mid(ws.Name, 5, 1)) Then     wkNum = Val(Mid(ws.Name, 5, 1))     If cnt < wkNum Then      cnt = wkNum     End If    End If   End If  Next ws  If cnt >= 5 Then   MsgBox ("明細書シートが既に5枚以上あるため追加できません")   Exit Sub  Else   Sheets("明細マスター").Copy after:=Sheets(Worksheets.Count)   ActiveSheet.Name = "明細書(" & cnt + 1 & ")"  End If End Sub マクロ自体をあまり理解できてなくて、会社の人や、ここで教えていただいて進めているので、出来ればそのままコピーして使用できるようにしていただけるとありがたいです。 よろしくお願いします。

  • エクセルマクロでフォルダのコピーがしたい

    こんにちわ 色々調べてフォルダのコピーはできたのですが、色々いじっていて分からないことが出てきたので質問に来ました。 やりたいことはフォルダをコピーしたいのですが、それぞれ名前を自動で変えようと思い下記(1)を元に下記(2)を作ってみましたが、動きませんでした。 (1)いくつかのサイトを見て動いたマクロ sub test() Dim myFSO As New FileSystemObject myFSO.CopyFolder "C:\test", "C:\test2" End Sub (2)ちょっといじって動かないマクロ sub test() Dim myFSO As New FileSystemObject Dim name As String Dim name2 As String name = "C:\test" name2 = "C:\test2" myFSO.CopyFolder "name", "name2" End Sub 「パスが見つかりません」と出てきたので、読み込んでいないのだとは思うのですが、どうしたら動くかアドバイスをいただきたいです。 よろしくお願いします。

  • エクセル マクロのFunctionプロシージャについて

    エクセルでユーザー定義関数を使う時にセル範囲を任意に指定して参照したいのですがやり方がよく分かりません。 たとえば、以下のマクロを記述して Function test(a,b) test=a+b End Function エクセルのシート上で =test(A1,A2) とすれば、計算結果が出てくると思いますが、この A1、A2と参照していたのを A1:A3 というように参照できるようにマクロを変更したいです。 どなたか教えてください。

  • VBAの関数で引数渡しでエラー

    関数呼び出しでObject型を渡したいのですが「引数の型が一致していません」との エラーになってしまいます。 以下のプログラムをどのように修正すればよいのでしょうか? Sub Test() Dim obj As Object Set obj = CreateObject("Scripting.Dictionary")     :   Sample(obj) End Sub Function Sample(obj As Object) End Function

  • Excel 自作関数から特定のセルを参照して分岐

    以下のように、C列を参照して判断し、それに適した値を表示させる関数を作っています。 質問1:以下、どこが間違ってますでしょうか? 質問2:以下では、Columns(3)として参照していますが、列に名前を付けておき、それを関数から参照させることはできますでしょうか? Function test()  Select Case Worksheets("Sheet1").Columns(3).Value   Case "りんご"    test = "100円"   Case "みかん"    test = "150円"   Case "いちご"    test = "300円"   Case "すいか2"    test = "200円"  End Select End Function

  • OpenOffice Basicで引数を2つ利用する関数が作れません

    OpenOffice Basicで引数を2つ利用する関数が作れません Open Office Calc 3.1.1を使っています。 できれば複数(3つ以上)引数を取る関数を作りたいのですが、 2つ引数を取ろうとすると演算結果が#NAME?になってしまいます。 切り分けにシンプルな関数を作ってみました。 以下で=test2(3,5)とすると結果が#NAME?になります。 Function test2(arg1 As Integer, arg2 As Integer) as Integer test2 = 3 + arg2 End Function #なお、関数内の演算内容はtest2 = arg1 + arg2でも変わらず#NAME?です 切り分けで以下を作ると=test3(3)で6が返されます Function test3(arg1 As Integer) as Integer test3 = 3 + arg1 End Function 関数名のタイプミスの可能性を排除するために、 test2関数を名前を換えずに引数の数を1つに変更してみると 計算できるのでタイプミスではないと思います。 やはり引数を複数とる取り方に問題があるように見えます。 お手数ですが何かアドバイスいただけないでしょうか?

  • VBA 関数(Function) カッコの後のデータ型は必要?

    Function あ() あ = "あああ" End Function Sub test3() MsgBox あ End Sub と、 Function あ() As String あ = "あああ" End Function Sub test3() MsgBox あ End Sub は同じ動作をするのですがやはり「As String」をつけたほうがいいのですか? ウォッチウインドウで確認すると 「As String」がないほうは「Variant/ String」型ですが あるほうは「String」型のみです。

  • Excel VBAについて

    Excel VBAにおいて、Sheetの選択した行によって値を表示するUserFormを変更したいと思っています。 現在以下のようにしたのですが、実行すると「SubまたはFunctionが定義されていません」というエラーが表示されます。 「Controls("UserForm" & x).Label1.Caption =」のところをどのようにしたらよいのでしょうか。 Private Sub CommandButton1_Click()   If ActiveCell.Row = 5 Then     UserForm1.Show     x = 1   ElseIf ActiveCell.Row = 6 Then     UserForm2.Show     x = 2   End If End Sub Private Sub Worksheet_Selection Change(Byval Target As Range)   Controls("UserForm" & x).Label1.Caption = ・・・

  • エクセルのマクロについて

    QNo.3421130で質問させて頂いた件の続きなのですが 入力シート(1)のA1に入力された値を、シート2のB1に表示(つまりB列の同じ行数のセルに表示)するというマクロをお教え頂き、早速実践してみましたが、入力シートA1に入っている値が入力シートA10から算出された値(例:A11に日付の2007/10/18と入っていて、A10にはMONTH関数で10だけを抽出している。そのA10の値10をA1が参照している状態やIF関数で反映された値等)がシート2に表示されません。 また本マクロは入力シート(1)とシート2の同じ行列のセルの表示しか出来ませんが、たとえば入力シート(1)のA2セルの値をシート2のB4に表示(任意で表示位置を変更する方法、シート2の反映セルを下へずらす等)が分りません。 以下、お教え頂いたマクロです。 Private Sub Worksheet_Change(ByVal Target As Range)  If Target.Column = 1 Then    Sheets("Sheet2").Cells(Target.Row, "B").Value = Target.Value  End If End Sub 続きの質問であることと、説明が分りにくく大変申し訳ありません。 非常に困っております。よろしくお願いします。

専門家に質問してみよう