• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ExcelVBAでClassの返り値について)

ExcelVBAでClassの返り値について

nofx35の回答

  • ベストアンサー
  • nofx35
  • ベストアンサー率82% (14/17)
回答No.2

イメージだけですが、参考になりますか。 Class1 Private m_Items As Collection Private Class_Initialize() Set m_Items = New Collection End Sub Public Sub Add(ByVal obj As Class2) m_Items.Add obj, CStr(obj.Name) End Sub Public Property Get Item(Byval vValue As Variant) As Class2 Set Item = m_Items(vVlaue) End Property Public Sub Method() MsgBox "これはClass1のメソッドです" End Sub Class2 Private m_Name As String Public Function Init(Byval strName As String) As Class2 m_Name = strName Set Init = Me End Function Public Property Get Name() As String Name = m_Name End Property Public Sub Method() MsgBox "これはClass2(" & Name & ")のメソッドです" End Sub Sub Try() Dim o As Class1 Dim oo As Class2 Set o = New Class1 Set oo = New Class2 o.Add oo.Init("1") Set oo = New Class2 o.Add oo.Init("2") o.Method o.Item("1").Method '上の行は Class1のItemプロパティを既定のプロパティに設定すれば o("1").Method 'とメソッドチェーンが記述出来ます 'WorkBooks("hoge").WorkSheets・・・・と同じですね End Sub oだけならClass1への参照 o. ならClass1のメンバへアクセス o.Item("1") はClass1が持つItemプロパティ(型はClass2型)によりClass2の参照を得る Itemを省略可能なプロパティに設定すれば o("1")だけでClass2への参照が得られる o("1"). でClass2が持つメンバへアクセス可能になる コンパイルしてませんので、適宜修正願いますm(_ _)m

sample_
質問者

お礼

クラスを2つ使いで表現ですか! なかなか面白いアプローチですね 参考にいじくってみます!

関連するQ&A

  • ExcelVBA ブック全データを別ブックにコピー

    お世話になります。 自分のPC環境のC:\test\配下にある"練習.xls"というブックがります。 ボタンが押された時にこのブックの全データをデスクトップにある"集計.xls"のA1から張り付けたいのです。 あるサイトで下記のようなロジックが公開されていましたので、ファイル名を変えて実行しましたが 下記★箇所で"インデックスが有効範囲にありません"とエラーが出てしまいます。 どなたか改善方法をご教授いただけませんでしょうか? よろしくお願い致します。 環境 windows XPSP3  Excel2003 Sub ボタン1_Click() Dim a As Variant Dim b As Variant Workbooks.Open Filename:="C:\test\練習.xls" ★Set a = Workbooks("\C:\test\練習.xls").Worksheets("sheet1").UsedRange Set b = Workbooks("集計.xls").Worksheets("sheet1").Range("A1") a.Copy (b) Set a = Nothing Set b = Nothing End Sub

  • ExcelVBAで戻り値を返すには

    ExcelVBAで、Oracleからデータを取得してブックを閉じるVBAを作成しています。 行いたい事は、このVBAが正常終了したか異常終了したかを判定したいのですが、ブックからの戻り値の返し方がわかりません。 ExcelVBA側 ------- Function Auto_Open() Application.Visible = False Application.ScreenUpdating = False ret = RunExec() 'Oracleからデータ取得 If (ret <> True) Then Auto_Open = False Else Auto_Open = True End If ActiveWorkbook.Saved = True Application.DisplayAlerts = False ThisWorkbook.Application.Quit End Function ------- このVBAをコマンドプロンプトから起動しても、正常時も失敗時も%ERRORLEVEL%が0になります。 ブックを閉じるときに戻り値を返す事はできないのでしょうか。

  • ExcelVBAで他ブックのマクロを動かす

    Aというブックのマクロを動かし、別ブックのコマンドボタンに埋め込まれているマクロの動作を行いたいのですがうまく行きません。 下記がコードになります。 Option Explicit Public strName As String Public strPath As String Public xlApp As Object Public xlBook As Object Public xlSheet As Object Public Function テスト処理() 'ファイル名 strName = Worksheets("名前").Range("B2") 'ファイルを置いている場所 strPath = Worksheets("名前").Range("B3") Set xlApp = CreateObject("Excel.Application") '別Excelを開く Set xlBook = xlApp.Workbooks.Open(strPath, True) 'シートの選択 Set xlSheet = xlBook.Worksheets("操作画面") xlApp.Visible = True xlApp.UserControl = True xlSheet.Activate setブック処理 End Function Public Sub setブック処理() '別ブックのマクロを動かす Application.Run (strName & "!CmdClick"), ThisWorkbook   End Sub 上記のマクロを動かすと、Application.Runの部分で下記エラーが表示されます。 実行時エラー1004 '別ブック.xls'が見付かりません。ファイル名及びファイルの保存場所が正しいかどうか確認してください。 setで飛ぶ前に別のブックは開けているので、ファイル名や保存場所は正しいと思うのですがエラーが出てしまいます。 宣言の仕方が間違っているのでしょうか? ちなみに、別ブックのコマンドボタンのマクロは下記の名称なので、マクロ名の間違いという事も無いと思います。 Private Sub CmdClick() ~処理~ End Sub

  • Excelvba2000でExcelファイル間のコピーを行いたい

    現在マクロ実行中のExcelブックのシートのセルの値を、 新規作成したブックのシートのセルに値を貼り付けたいのですが、 うまくいきません。 ただし、コピーの条件として、クリップボードは使用しない Activeメソッドや、Selectメソッドも使用しないという制約があります 以前は、うまくいっていたのですが、コードの書き方を忘れてしまいました。以下の★印の行で、 「RangeクラスのCopyメソッドが失敗しました。」とエラーが出ます。 以前は、以下のコードに似た、ロジックで、問題なかったのですが、 どこか間違っていますでしょうか? Dim xlsApp As Excel.Application Dim xlsBook As Excel.Workbook Dim xlsSheet As Excel.Worksheet Set xlsApp = CreateObject("Excel.Application") Set xlsBook = xlsApp.Workbooks.Add Set xlsSheet = xlsBook.Worksheets(1) '★エラー発生 ThisWorkbook.Worksheets("Sheet1").Range("A1:D4").Copy _ Destination:=xlsBook.Worksheets("Sheet2").Range("E5")

  • ExcelVBAでのページ設定

    ExcelVBAで、新しいブックを開き、そのページ設定をしたく、以下のような記述をしたのですが、余白の値が変わりません。 Private Sub Workbook_Open() Workbooks.Add With ActiveSheet.PageSetup .TopMargin = Application.CentimetersToPoints(1.7) .BottomMargin = Application.CentimetersToPoints(1.7) .LeftMargin = Application.CentimetersToPoints(0.9) .RightMargin = Application.CentimetersToPoints(1.1) .HeaderMargin = Application.CentimetersToPoints(1.3) .FooterMargin = Application.CentimetersToPoints(1.3) End With (以下省略) Workbooks.Addを記述せず、新しいをブックを開かなければ、思い通りの動作をします。 外部ファイルを読み込んで、帳票を作るVBAなので、起動時に新しいブックを開きページ設定をしたいのですが、Workbook_Open()で、このような使い方は出来ないのでしょうか? よろしくお願いします。 尚、会社のLANからgooの閲覧が規制されており、返事が遅れるかもしれません。ご理解の程、お願いします。

  • VBAでユーザーフォームからクラスモジュールの関数を呼び出したい

    ExcelのVBAでの質問です。 クラスモジュールよりユーザーフォームを呼び出し、そこから呼び出したクラスモジュールにある関数を呼び出したいと思っています。 ところが、実行すると 実行時エラー'91': オブジェクト変数またはWithブロック変数が設定されていません。 と表示されてしまいます。 以下に、コードを抜粋します。 ------------------------------------------------------------ ・ClassDataBase(クラスモジュール) Public Function EmployeeEdit() Load DBUserEdit DBUserEdit.Show Unload DBUserEdit End Function Public Function DataBaseRead(ByVal Table As Variant, Optional ByVal Filter As Variant) DataBaseBook.Sheets(Table).Copy After:=Sheets(Sheets.Count) ActiveSheet.Name = "temp" Range(Range("B3"), ActiveCell.SpecialCells(xlCellTypeLastCell)).Select End Function ------------------------------------------------------------ ・DBUserEdit(ユーザーフォーム) Private Sub UserForm_Initialize() Dim DB As New ClassDataBase DBAuthority.List = Array("Admin", "User", "Data") DBAuthority.Value = "Admin" 'この次の行でエラーを起こしていると思われます DB.DataBaseRead ("社員情報") End Sub ------------------------------------------------------------ どうすればいいのでしょうか? よろしくお願いいたします。

  • ExcelVBAで選択範囲のみ新規ブックにコピペ(EXCEL2007)

    ExcelVBAで選択範囲のみ新規ブックにコピペ(EXCEL2007) EXCEL2007にて下記VBAプログラムを実行すると、 ActiveSheet.PasteSpecialの部分で 「アプリケーション定義またはオブジェクト定義のエラーです。」 とエラーメッセージがでます。 なぜなのでしょうか? お願いいたします。 '選択範囲コピー Range("AllData").Copy '新規ブックの追加 Set WB = Workbooks.add WB.Activate ActiveSheet.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False

  • ExcelVBA:自己のBook名を取得したい

    WindowsXP-Proです。 Excelヴァージョンは2003です。 ExcelVBAでコーディングしています。 で、自分自身(つまり、このVBAコードを記述しているExcel本体)のBook名を取得したいのですが、何か関数は用意されていますでしょうか? 自分自身のBook名を取得したい理由は、VBAコードを記述しているExcel本体のファイル名(Book名)の名前が変更されても、VBAが正常に機能するように、今現在のBook名を取得したいのです。 複数のExcelファイルを、このVBAで操作しているため、 Workbooks("本体のBook名").Activate を用いており、仮にファイル名(本体のBook名)の名前が変更されても、VBAが正常に機能できるように、"本体のBook名"部分を固定ではなく、可変で持てるようにしたいからです。

  • class を使用した時の考え方について

    趣味として、プログラミングしているレベルです。職業としての開発経験はありません。 実際の開発業務においては、どちらが一般的なのか、教えて下さい。 例として、ファイル内の行数をを取り込む場合。(Excel VBA です。) Case 1 は、メイン処理の記述数が少ないのですが、クラス内での処理がネスト化しています。 Case 2 は、メイン処理で、一々関数を呼び出していますが、クラス内の関数は、独立しています。 ■ Case 1 -----メイン-------------------------------------------------- Dim argetFile As TargetFile Dim fileRowCount As Long Set targetFile = new TargetFile fileRowCount = targetFile.rowCount("c:\", "sample.txt") Set targetFile = Nothing -----TargetFile.cls-------------------------------------------------- private myFileName As String private myFileData As Variant ' ファイルを開く Private Function openFile() 'myFileName を開く処理 End Function ' ファイル内のデータを取り込む Private Function readFile() Call openFile() myFileData = ' myFileName 内データを取り込む処理 End Function ' ファイル内の行数を取得 Public Function rowCount(pPath As String, pFileName As String) As Long myFileName = pPath & pFileName Call readFile rowCount = 'myFileData から、行数を取得する処理 End Function ------------------------------------------------------- ■ Case 2 -----メイン-------------------------------------------------- Dim targetFile As TargetFile Dim fileRowCount As Long Set targetFile = new TargetFile Call targetFile.openFile("c:\", "sample.txt") Call targetFile.readFile fileRowCount = targetFile.rowCount Set targetFile = Nothing -----TargetFile.cls-------------------------------------------------- private myFileName As String private myFileData As Variant ' ファイルを開く Public Function openFile(pPath As String, pFileName As String) myFileName = pPath & pFileName 'myFileName を開く処理 End Function ' ファイル内のデータを取り込む Public Function readFile() myFileData = ' myFileName 内データを取り込む処理 End Function ' ファイル内の行数を取得 Public Function rowCount() As Long rowCount = 'myFileData から、行数を取得する処理 End Function -------------------------------------------------------

  • ExcelVBAで特定のブックをcloseしたい

    よろしくお願いします。Excel2000ですが、2002,2003,2007でも利用できることを前提に考えています。  複数のExcelブックを開いているとき、特定のファイル名のブックを閉じる方法を考えています。  2通り考えたのですが、いずれもだめでした。デバッグ機能でステップインしながら確認したのですが、エラーにもならず、closeメソッドを通過していました。 以下のVBAはなにか誤りがあるのでしょうか? (その1)  For i = 1 To Workbooks.Count   If Left(Workbooks(i).Name, 2) = "v3" Then    msw = Workbooks(i).Name    If msw <> "V3main.xls" Then     Workbooks(msw).Close    End If   End If  Next (その2)  For Each wb In Workbooks   If Left(wb.Name, 2) = "v3" Then    MsgBox (wb.Name)    If wb.Name <> "V3main.xls" Then     With wb      .Saved = True      .Close     End With    End If   End If  Next wb