- 締切済み
クラスの作成方法を教えてください
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1328191 標記の内容がわからなくうまくいきません 作成したいクラスの内容 ・CSVのデータ1行を表すクラス(CsvQueueクラスとする) ・メンバー変数は、 その1行のデータとCsvQueueクラスへのポインタ。 データは面倒ならPublic。 ・メンバー関数は、 PutData()とGetData()。 CsvQueueクラス Public strCsvData1 As String Public strCsvData2 As String Public strCsvData3 As String Private queNextData As CsvQueue 初歩的な質問ではございますが、 作成方法を教えてくださいます様、よろしくお願いいたします 以下、参考::::::::::::::::::::: Public Function PutData(ByVal q As CsvQueue) As Boolean If queNextData Is Nothing Then Set queNextData = q Exit Function End If PutData = queNextData.PutData(q) End Function Public Function GetData() As CsvData GetData = queNextData End Function CSV出力モジュール内(追加した行を++で表している) Private csvRoot As CsvData ' Nothingに初期化 Private Sub output(ByVal ofile As String) On Error GoTo trap handle = FreeFile() Open ofile For Append As #handle Do Until csvRoot Is Nothing (中略と同内容) csvRoot = csvRoot.GetData() Loop (中略) Print #handle, _ Close #handle Exit Sub trap: 'MsgBox Err.number & "," & Err.Description, vbInformation, "output" Dim csvTemp As New CsvData csvTemp.strCsvData1 = ... If csvRoot Is Nothing Then Set csvRoot = csvTemp Else csvRoot.PutData(csvTemp) End If End Sub
- nao0
- お礼率10% (50/483)
- Visual Basic
- 回答数1
- ありがとう数0
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- mokocho
- ベストアンサー率14% (1/7)
クラスモジュールをプロジェクトファイルに追加してください CsvQueue.cls(CsvQueue.basまたはCsvQueue.frm)みたいな感じで作成し、オブジェクト名をCsvQueueにしてください そのクラスモジュールに、 Public strCsvData1 As String Public strCsvData2 As String Public strCsvData3 As String Private queNextData As CsvQueue PutData()とGetData()の関数を記載 >Public Function PutData(ByVal q As CsvQueue) As Boolean の個所にて、エラー「ユーザー定義型は定義されていません ⇒CsvQueueがプロジェクト内にないため、発生しております 念のためですが呼び元では、 Dim A as CsvQueue Set A As New CsvQueue GetData A と記載してしてください
関連するQ&A
- クラス の作成方法
以前の質問で下記の様にご教示頂いたのですが、 標記の内容がわからなくうまくいきません 初歩的な質問ではございますが、 作成方法を教えてくださいます様、よろしくお願いいたします 用意するもの 1.CSVのデータ1行を表すクラス(CsvQueueクラスとする) メンバー変数は、その1行のデータとCsvQueueクラスへのポインタ。データは面倒ならPublicでよいだろう。 メンバー関数は、PutData()とGetData()。 CsvQueueクラス Public strCsvData1 As String Public strCsvData2 As String Public strCsvData3 As String Private queNextData As CsvQueue 参考::::::::::::::::::::: Public Function PutData(ByVal q As CsvQueue) As Boolean If queNextData Is Nothing Then Set queNextData = q Exit Function End If PutData = queNextData.PutData(q) End Function Public Function GetData() As CsvData GetData = queNextData End Function CSV出力モジュール内(追加した行を++で表している) Private csvRoot As CsvData ' Nothingに初期化 Private Sub output(ByVal ofile As String) On Error GoTo trap handle = FreeFile() Open ofile For Append As #handle Do Until csvRoot Is Nothing (中略と同内容) csvRoot = csvRoot.GetData() Loop (中略) Print #handle, _ Close #handle Exit Sub trap: 'MsgBox Err.number & "," & Err.Description, vbInformation, "output" Dim csvTemp As New CsvData csvTemp.strCsvData1 = ... If csvRoot Is Nothing Then Set csvRoot = csvTemp Else csvRoot.PutData(csvTemp) End If End Sub
- 締切済み
- Visual Basic
- VB6.0のクラスで、自分自身のインスタンスを作成するメリット
クラスのメソッドで、自分自身のインスタンスを作成している、コードをよく見かけます。 どんなメリットがるのでしょうか? 簡単に、クラスファイルのコードを書きました。 【A.cls】 Option Explicit Dim pstrID As Long Dim pstrName As String Public Function fncCreate() As Object Set fncCreate = New clsA '★自分自身のインスタンスを作成する End Function Public Function fncID() As Boolean pstrName = "ID" End Function Public Function fncName() As Boolean pstrName = "STRING" End Function Private Sub Class_Initialize() pstrID = 0 pstrName = "" End Sub
- ベストアンサー
- Visual Basic
- クラスの初期値設定について
早速ですが、教えてください(開発環境は WindowsXP,VisualBasic.NET2003 です) Public Class CCC Private Key As Integer Private Value As String End Class 上記のようなクラスを用意して Public Sub SSS() Dim III() As CCC = New CCC() {{1, "VALUE1"}, _ {2, "VALUE2"}} End Sub といった具合に初期値を設定したいのですが、 コンパイルエラー(配列初期化子の次元が多すぎます。)に なってしまいます。(ほかに思いついた記述パターンも試してみましたがだめでした) 仕方なく、CCCに下記のようなメソッドを作って Public Class CCC Private Key As Integer Private Value As String Public Sub SetValue(ByVal a As Integer, ByVal b As String) Key = a Value = b End Sub End Class このメソッドを利用し Public Sub SSS() Dim III() As CCC III(0).SetValue(1, "VALUE1") III(1).SetValue(2, "VALUE2") End Sub 上記のように初期値を設定するようにしています。 初期化子({})をつかって、C言語?風に初期値を設定することは できないのでしょうか? 上記の例では、顕著に現れてませんが、クラスの中のクラスにも 初期値を設定しようとする場合、どのような初期値が設定されて いるかが、ソース上、整然と並ばなくなってしまい、修正しにくい 、見た目が美しくない状態になってしまいます。 何かよい方法はないのでしょうか?ご教示願います。 (参考URLだけでもかまいません、よろしくお願いします)
- ベストアンサー
- Visual Basic
- APIを使う時は参照設定は不要?
例えば Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Sub test() Dim Handle As Long Handle = FindWindow("IEFrame", vbNullString) Debug.Print Handle End Sub と言うコードでウィンドウハンドルを取得する場合、 参照設定のどこにもチェックを入れませんが、なぜ参照設定しなくても使えるのでしょうか? Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long が参照設定の代わりになるのですか?
- ベストアンサー
- オフィス系ソフト
- クラスモジュールの処理
VB6.0で開発しています。 以下のようにクラスモジュールを作ったのですが フォームでコマンドボタンを押したら 処理されるようにしたいのですが どうすればいいかわかりません。 教えてください。 Class CExcel Public App Public WshShell Public ErrDescription Private WorkBook Public CurBook Private Sub Class_Initialize() Call InitSetting() End Sub Private Sub Class_Terminate() Call Quit() End Sub Public Default Function InitSetting() if IsEmpty( App ) then Set App = CreateObject("Excel.Application") end if if IsEmpty( WshShell ) then Set WshShell = CreateObject("WScript.Shell") end if App.DisplayAlerts = False Set CurBook = Nothing end function Public Function Quit() If not IsEmpty( App ) Then For Each Workbook In App.Workbooks WorkBook.Saved = True Next App.Quit Set App = Nothing App = Empty Set CurBook = Nothing End If End Function Public Property Let Visible( bFlg ) App.Visible = bFlg End Property Public Property Get Visible Visible = App.Visible End Property Public Function Open( strPath ) on error resume next Set Open = App.Workbooks.Open(strPath) if Err.Number <> 0 then Set Open = Nothing ErrDescription = Err.Description Exit Function end if on error goto 0 Set CurBook = Open ' アクティブなウィンドウを最大化 App.ActiveWindow.WindowState = xlMaximized End Function Public Function Create( strPath ) Dim nBooks App.Workbooks.Add nBooks = App.Workbooks.Count Set Create = App.Workbooks( nBooks ) Set CurBook = Create CurBook.Activate App.ActiveWindow.WindowState = xlMaximized if strPath <> "" then on error resume next CurBook.SaveAs( strPath ) if Err.Number <> 0 then MsgBox( Err.Description ) Exit Function end if on error goto 0 end if End Function Public Function Close( MyBook ) if IsObject( MyBook ) then MyBook.Saved = True MyBook.Close Set MyBook = Nothing MyBook = Empty else if CurBook is Nothing then else CurBook.Saved = True CurBook.Close Set CurBook = Nothing end if end if End Function Function Save( MyBook ) if IsObject( MyBook ) then MyBook.Save else CurBook.Save end if End Function Function SaveAs( MyBook, strPath ) if IsObject( MyBook ) then MyBook.SaveAs strPath else CurBook.SaveAs strPath end if End Function Function Load( strPath ) if not IsEmpty( App ) then MsgBox( "Excel をロードする前に、Quitを実行して下さい " ) Exit Function end if Call WshShell.Run( _ "RunDLL32.EXE shell32.dll,ShellExec_RunDLL " & _ strPath _ ) End Function End Class
- 締切済み
- Visual Basic
- Excel VBAフォーム 登録ボタンの作成方法
いつもお世話になっています。 初めて、Excelのフォームで入力画面を作りました。 複数の項目があって、それを最後に[登録]ボタンをクリックで 表に入れたいのですが、一度にまとめて実行する方法が分かりません。 アドバイスよろしくお願いいたします。 Private Sub cmd_1() Dim i As String If man.Value = True Then ActiveCell = man.Caption End If If woman.Value = True Then ActiveCell = woman.Caption End If ActiveCell.Offset(0, 1).Select End Sub Private Sub cmd_2() Dim i As String If man.Value = True Then ActiveCell = Yes.Caption End If If woman.Value = True Then ActiveCell = No.Caption End If ActiveCell.Offset(0, 1).Select End Sub Private Sub cmd_downlist() Dim ListNo As Long ListNo = group.ListIndex ActiveCell.Value = group.List(ListNo, i) ActiveCell.Offset(0, 1).Select End Sub Private Sub cmd_comment() ActiveCell = comment.Text ActiveCell.Offset(1, -3).Select End Sub
- 締切済み
- Visual Basic
- クラス
VB.NET 学習58日目という初学者です。 未だ、Sub Main() でシコシコと基本事項の確認中です。 やっと構造体の演習を昨日から。 案の定、わからないことに遭遇しました。 ' ============================== ' TEST1、TEST2 の BSave、BLoad ' ============================== Module theTEST1 Sub Main() ' ----------------------- ' TEST1 の BSave、BLoad ' ----------------------- Dim T1 As New TEST1 T1.Member1 = "T1.Member1" T1.Member2 = "T1.Member2" BSave(T1, "D:\Temp\T1.BIN") T1.Member1 = "AAA" T1.Member2 = "BBB" Debug.Print(T1.Member1) Debug.Print(T1.Member2) T1 = CType(BLoad("D:\Temp\T3.BIN"), TEST1) If T1.Member1 <> Nothing Then ' Null エラーが回避できない! Debug.Print(T1.Member1) Debug.Print(T1.Member2) Else Message("") End If ' ----------------------- ' TEST2 の BSave、BLoad ' ----------------------- Dim T2 As TEST2 T2.Member1 = "T2.Member1" T2.Member2 = "T2.Member2" BSave(T2, "D:\Temp\T2.BIN") T2.Member1 = "AAA" T2.Member2 = "BBB" Debug.Print(T2.Member1) Debug.Print(T2.Member2) T2 = CType(BLoad("D:\Temp\T3.BIN"), TEST2) If T2.Member1 <> Nothing Then Debug.Print(T2.Member1) Debug.Print(T2.Member2) Else Message("") End If End Sub End Module Function BLoad(ByVal aPath As String) As Object If File.Exists(aPath) Then Try Using fs As New FileStream(aPath, FileMode.Open, FileAccess.Read) Dim bf As New BinaryFormatter Dim aObject As Object = bf.Deserialize(fs) fs.Close() Return aObject End Using Catch ex As IOException MsgBox(ex.Message & "(BLoad)", , "エラー:") Return Nothing End Try Else Return Nothing End If End Function T1 はクラスライブラリで定義。 T2 は構造体。 構造体の場合は、Nothing でチェックできました。 しかし、クラスライブラリの場合はチェックできません。 このエラーの考え方と処し方を教えてください。 構造体とクラスライブラリは表向きは同じようなもの。 ですから、どちらにも通用する BSave、BLoad 関数を作成使用としたわけです。 宜しくお願いします。
- ベストアンサー
- Visual Basic
- エクセルのマクロでクラスのプロパティについて
エクセルでセルがダブルクリックされたら フォームを表示し、フォーム内のリストボックス のクリック時の値をクラスのプロパティに実装 できるのでしょうか? 以前、仕事でそのようなクラスを呼び出して 使ったことがあるので。 エクセル側 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で どうすればよいか分からなくなりました。 根本的に間違っているのでしょうか? ネットでさがしたのですが参考になる サイトが見つかりません。 解決方法、宜しくお願い致します。
- ベストアンサー
- Visual Basic
- VB.net2008 設定画面の作成
VB.net2008 設定画面の作成 こんにちは、プログラミングの勉強を行っているのですが。 少し、躓いてしまったのでこちらで質問させてください。 Form1 と Form2 という二つのフォームを用意して。Form1で使用している設定値クラスをForm2にコピーして設定変更を行った後リターンで返すということを考えています。 ですが、どうしてもうまく書けないため、ご助言ください。 -----------------------以下ソース----------------- Public Class Form1 'XMLに設定保存 Private Sub SaveSetthing() Dim wset as New Setting 'XMLserializerで書き込み ~~~~~~~~~~~~~~~~~~~ End sub '設定読み込み Private Sub LordSetthing() 'XMLserializerで読み込み Dim lset as New Setthing ~~~~~~~~~~~~~~~~~~~ End sub EndClass Public Class Setthing Public UserName as String Public Age as Integer ~~~~~~~~~~~~~~~ Public Function Clone() as Setthing Return DirectCast(MyBase.MemberwiseClone,Setthing) End Function End Class ---------------------------------------------- このときに、Form1のボタンを押したらForm2を開く動作で ------------------------------------------------- Private sub ボタンクリック(Bybal*************) Dim f as Form2 = New Form2(Setthing.Clone) if f.ShowDialog = Windows.Forms.DialogResult.OK then me.Setthing = f.GetValue End if End sub ------------------------------------------------- ↑ここで返り値を受けたいと考えています。 ↓Form2構文 -------------------------------------------------- Public Class form2 Public sub New(ByVal Value as Setthing) InitializeComponent() Dim TempSetthing as Setthing = Value End sub 'ここで、渡された設定値の表示と設定画面で変更された設定の読み込み Public Function GetValue() As Setthing Return TempSetthing End function End Class -------------------------------------------------- と、大雑把に書き込みましたがこのような感じの処理を行いたいです。 ですが、私の理解が足りない為Form2内でTempSetthing内のデータの読み書きが行えません(宣言できません) 独学で作ったものですので、ここまでの流れがおかしなものになっている可能性もありますが。 「このような処理が行いたい!」というのは伝えれるかとは思います。 Form2内でTempSetthingの値を変更できるようなTextBox等を作成して。代入する形にしたいのですが。 ご教授お願いします・・・
- ベストアンサー
- Visual Basic
- APIについて
Private Declare Function GetComputerName Lib "kernel32.dll" Alias _ "GetComputerNameA" (ByVal NameBuff As String, ByVal Size As Long) As Long Public Sub New() mstrMyCompName = Me.QryComputerName() mstrMyDummyData = mstrMyCompName & mcstrDumyKey End Sub Public Function QryComputerName() As String Dim strTmp As String Dim lngPos As Long If 0& < GetComputerName(strTmp, 256) Then lngPos = InStr(strTmp, vbNullChar) QryComputerName = Left$(strTmp, lngPos - 1) Else QryComputerName = "UnKnown" End If End Function 上記の記述を含むクラスを生成した際に、GetComputerName(strTmp, 256)のところで下記のエラーが発生しますが、原因が分かりません。 'System.NullReferenceException' のハンドルされていない例外が AtnSys.exe で発生しました。 追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。 何がいけないのでしょうか? OS:Win2000 言語:VB.Net ソリューション名:AtnSys
- ベストアンサー
- Visual Basic