• ベストアンサー
  • 暇なときにでも

Excel2007 VBA Daoクラス

コーディング設計の質問です。 Oracle10gのDBに以下のテーブルがあります。 テーブル名:TEST_TABLE カラム名:CODE, NAME これから値を取得する際以下の方法をとっているのですが、VBA的に変なやり方ではないでしょうか。 クラスモジュール:TestDao, TestBean ExcelObjects----------------- Set ArrayList = TestDao.GetSQLResult(Conn, "検索条件", "0") For i = 1 To ArrayList.Count Step 1 Set Bean = New TestBean Set Bean = ArrayList.Item(i) Call Draw(Sheet, Bean, 1, 1) Row = Row + 1 Set Bean = Nothing Next i 描画メソッド-------- Private Sub Draw(ByVal Sheet As Object, _ ByVal Bean As Object, _ ByVal Row As Integer, _ ByVal Col As Integer) Sheet.Cells(Row, Col).Select ActiveCell.FormulaR1C1 = Bean.GetCode() Sheet.Cells(Row, Col + 1).Select ActiveCell.FormulaR1C1 = Bean.GetName() End Sub JAVAに触った方ならわかると思うのですが、 TestDaoにはSQL文を記述・実行し、取得した結果を格納する。 TestBeanにはテーブルのカラムのプロパティを配置しています。 VBAの場合、こういったクラスを作成する必要はありますでしょうか。 (より良いやり方はありますでしょうか)

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数989
  • ありがとう数1

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

  • ベストアンサー
  • 回答No.1
  • nda23
  • ベストアンサー率55% (773/1384)

先ず、S2で言うDAOとVBAで言うDAOは全然別物です。 それにS2だからBeanを使える(S2がセッタを呼び出してくれる)ので あって、S2を利用できない環境では誰がネタを仕込んでくれると言う のでしょう? ADOによるDBアクセスを参照する方が良いでしょう。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

回答ありがとうございます。 >誰がネタを仕込んでくれると言うのでしょう? S2DaoなどO/Rマッピングツールは使用していません。 BeanもDaoも全て自前で作りました。 >ADOによるDBアクセスを参照する方が良いでしょう。 的外れなことを言っていたら申し訳ありません。 色々調べたのですが、ADOはDB接続を簡単にしてくれるだけでDaoやエンティティといった思想はないですよね。 http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_130_030.html (ADOの役割?) Set Conn = CreateObject("ADODB.Connection") Conn.Open "Provider=MSDAORA;" & "Data Source=" & _ oracle_sid & ";", oracle_user, oracle_password 'Set ResultSet = Conn.Execute(Sql) 'Set Bean = New TestBean 'Bean.SetCode = ResultSet(0).Value 'ArrayList.Add(Bean) 'Set ResultSet = Nothing 'Conn.Close 'Set Conn = Nothing ですのでデータベース層とロジック層を切り分ける手段にどのようなものがあるのかと考え質問しました。

関連するQ&A

  • EXCEL2007のマクロで2つのBOOKを比較

    EXCEL2007のマクロでABook,BBookと2つのBookのセルを比較して、数値が違うセルがある場合、BBookの方に新しいsheetを作成して、このsheetのA列に数値が違うセルの番地を、新しいsheetのA1、A2・・・と埋めていくマクロは作成する事は出来るでしょうか?因みに新しいsheetを作成するマクロまでは、出来ました。しかし、新しいsheetのA1、A2と書き込んでいくと、クリップボードの値がA1、A2、・・・入ってしまいます。 Dim ws1 As Object Dim ws2 As Object Dim ws3 As Object Dim co As Integer, ro As Integer, e As Integer Set ws1 = Workbooks(bookname1).Worksheets("明細") Set ws2 = Workbooks(bookname2).Worksheets("明細") Set ws3 = Workbooks(bookname2).Worksheets("エラーセル") If ws1.Cells(y, x).Value = ws2.Cells(y, x).Value Then Else ws3.Cells(e).Select ActiveCell.FormulaR1C1 = "A,e+1" End If マクロの骨格はこんな感じですけど、後は、Forループで回せば良いと考えております。 ActiveCell.FormulaR1C1 = "A,e+1"の部分が良く分かりません。 どの様にすれば、新たに作成したsheetのA1に数値が違うセルの番地例えばE5と入れる事が出来るのでしょうか、それもE5一つだけではなく沢山あります。G7とか・・・ どなたか、ご教授願います。宜しくお願い申し上げます。

  • エクセル2010のvbaについて

    Sheet1に挿入したイメージ(ActiveX)をクリックすると数字が上がって 実行中にもう一度同じイメージをクリックすると止まるようにしたいのですが 数字が上がったまま止まりません(上限はあるのでオーバーフローはしません) Worksheet_SelectionChangeで(ActiveXのイメージがもう一回押されて) 選択セルが変わったら停止としたかったのですが反応しません イメージをクリック(実行)してもう一回押すとクリックしている間は止まりますが離すと再開されます コードにクリックされた回数がわかるようにしましたが増えません 説明が分かりにくかったら追記します 回答お願いします クラスモジュールのコード(イメージの名前によって少し処理を変えるためです) Private Sub myImg_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Dim i As Integer, a, b, C As POINTAPI, obj As OLEObject i = myImg.Index - 1 Call GetCursorPos(C) Set obj = ActiveWindow.RangeFromPoint(C.X, C.Y) b = Range("A1") Range("A1") = obj.Name Range("A2") = Range("A2") + 1    'クリックされた回数が分かるようにするため追加 If Range("A2") = 2 Then Range("C1").Select End If Range("A3") = "B1" If obj.Name = 2 Then Range("A3") = "B3" Range(Range("A3")).Select End Sub Sheet1のコード Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) If Target.Address <> Range(Range("A3")).Address Then Exit Sub Do While ActiveCell < Range("A4") * 100 If ActiveCell.Address <> Range(Range("A3")).Address Then Exit Do End If DoEvents ActiveCell = ActiveCell + 1 Loop End Sub

  • 同期の並び替えで、規則的ですが、数が多くて処理に困っています。何かいい方法はないでしょうか?

    同期の並び替えで、規則的ですが、数が多くて処理に困っています。何かいい方法はないでしょうか? 一通り最後までやったのですが、ものすごい数になってしまいました。 下記 Sub Macro1() Sheets("sheet2").Select 'sheet1のA君のデータ(C列の10,14,18,22~90)をsheet2(C列)に同期 Range("C8").Select ActiveCell.FormulaR1C1 = "=sheet1!R[2]C" Range("C9").Select ActiveCell.FormulaR1C1 = "=sheet1!R[5]C" Range("C10").Select ActiveCell.FormulaR1C1 = "=sheet1!R[8]C"      ・      ・      ・   Range("C31").Select ActiveCell.FormulaR1C1 = "=sheet1!R[71]C" 'sheet1のB君のデータ(D列の10,14,18,22~90)をsheet2(E列)に同期 Range("E8").Select ActiveCell.FormulaR1C1 = "=sheet1!R[2]C[-1]" Range("E9").Select ActiveCell.FormulaR1C1 = "=sheet1!R[5]C[-1]" Range("E10").Select ActiveCell.FormulaR1C1 = "=sheet1!R[8]C[-1]"      ・      ・      ・   Range("C31").Select ActiveCell.FormulaR1C1 = "=sheet1!R[71]C[-1]" 'sheet1のC君のデータ(E列の10,14,18,22~90)をsheet2(G列)に同期 Range("G8").Select ActiveCell.FormulaR1C1 = "=sheet1!R[2]C[-2]" Range("G9").Select ActiveCell.FormulaR1C1 = "=sheet1!R[5]C[-2]" Range("G10").Select ActiveCell.FormulaR1C1 = "=sheet1!R[8]C[-2]"      ・      ・      ・   Range("G31").Select ActiveCell.FormulaR1C1 = "=sheet1!R[71]C[-2]"       と続き 最終的には 'sheet1のV君のデータ(X列の10,14,18,22~90)をsheet2(AS列)に同期   Range("AS8").Select    ActiveCell.FormulaR1C1 = "=集計関連!R[2]C[-21]"      ・      ・      ・   Range("AS31").Select    ActiveCell.FormulaR1C1 = "=集計関連!R[71]C[-21]" End Sub と一応規則的に並び替えています。…が、途方もない数になってしまうのですが、何か省略したり…というような方法はないでしょうか? よろしくお願いいたします。

  • PostgresのViewをExcelのVBAでレコード取得できない

    はじめまして。mady1234と申します。 Postgresを利用した社内ツールを作成しています。 Postgresのテーブルからレコード取得は出来ますが、Viewからの取得が出来ません。エラーが発生します。 実行時エラー'-2147467259(8004005)': 環境はサーバーはVine4.2 Postgres8.3 クライアントのOSはXP Excelは2003です。 色々と検索しましたが、テーブルのレコード取得の方法はあってもビューは見つけれませんでした。 ご教授の程、宜しくお願いいたします。 --------------------------以下、VBAの記述です-------------------  Dim row1,col1, as integer row1=1 col1=1 Dim adoCON As New ADODB.Connection Dim adoRS As ADODB.Recordset Set adoCON = New ADODB.Connection adoCON.CommandTimeout = 0 adoCON.ConnectionString = "DSN=PostgreSQL30;" & _ "uid=postgres;" & _ "pwd=;" adoCON.Open Set adoRS = New ADODB.Recordset adoRS.Source = " SELECT * from View1;" adoRS.ActiveConnection = adoCON adoRS.CursorType = adOpenKeyset adoRS.LockType = adLockOptimistic adoRS.Open Do Until adoRS.EOF Worksheets("sheet1").Cells(row1, col1).Value = adoRS!usuryou adoRS.MoveNext row1 = row1 + 1 Loop adoRS.Close adoCON.Close Set adoRS = Nothing Set adoCON = Nothing

  • スプレッドについて

    VBも素人なんですが、スプレッドのとり方を教えてください。 以下のスプレッドが既存で存在していてチェックボックスが各行ごとにあるのですが、チェックしたときに呼ばれる関数を以下に書きました。 例えば002という値を取得したいときどうコーディングしたらよいでしょうか?  _____________  | 001 | AAAA |  a   |   |-----|------|----------|     | 002 | BBBB |  b   |  |-----|------|----------|  | 003 | CCCC |  c   |  |-----|------|----------| ※関数の中身は適当です。どうやったらとれるか試行錯誤しています。。。 Private Sub sprService_ButtonClicked(ByVal Col As Long, ByVal Row As Long, ByVal ButtonDown As Integer) Dim intbutton As Integer Col = Row intbutton = ButtonDown sprService.Col = sprService.Row sprService.Col = sprService.Row2 End Sub

  • EXCEL VBAの書き方

    EXCEL VBAの初心者です。 EXCEL2003を使っています。 数式の中のパラメータの書き方が分からず困っています。 具体的には、単純な計算をR1C1形式の数式を使い、FOR文でループを回そうとしました。 この際、例えば以下のようなVBAを、試行錯誤の結果やっと動くようにはなりましたが、とくに「"」(ダブルクォーテーション)の使い方が理解できていません。 NGだった理由、OKとなった理由を、すみませんがお分かりの方教えていただけないでしょうか。 (ヘルプを読んでも残念ながら理解できる程のレベルを持っていません。) やりたいこと:例えば単純な引き算を複数のセルに、ループをまわして設定したい。 --------------- Sub 質問() Dim i As Integer ' "A1"との差を求めるVBA→ "B2"から"E2"に数式入力 For i = 2 To 5 Cells(2, i).Select ' (1)問題の行→これはOKの例 ActiveCell.FormulaR1C1 = "=r[-1]c-r[-1]c[" & 1 - i & "]" Next i End Sub --------------- ' (2)問題の行→実行時エラー'1004' ActiveCell.FormulaR1C1 = "=r[-1]c-r[-1]c[1 - i]" --------------- ' (3)問題の行→コンパイルエラー(構文エラー) ActiveCell.FormulaR1C1 = "=r[-1]c-r[-1]c["1 - i"]" --------------- ' (4)問題の行→コンパイルエラー(構文エラー) ActiveCell.FormulaR1C1 = "=r[-1]c-r[-1]c["&1 - i&"]" ---------------

  • excel2003のマクロで全シートを選択したい場合

    初心者です、お願いします。 Sheets(Array("Sheet1", "Sheet2", "Sheet3")).Select Sheets("Sheet1").Activate Range("E1").Select Selection.NumberFormatLocal = "G/標準" ’現在文字列 ActiveCell.FormulaR1C1 = "7/1/2008" Range("F1").Select Selection.NumberFormatLocal = "G/標準"  ’現在文字列    ActiveCell.FormulaR1C1 = "5/31/2009"  上記の記述で1行目、全シートの選択を指定したいのです。 どのように変えたら良いかどなたか教えてください。

  • VBAでクラス設定

    (標準モジュール) Option Explicit Sub test() Dim Class As Class1 Set Class = New Class1 Class.Obj = 1000 Set Class = Nothing Set Class = New Class1 Range("a1").Value = Class.Obj Set Class = Nothing End Sub (クラスモジュールClass1) Option Explicit Private a As Integer Public Property Get Obj() As Integer Obj = 2000 End Property Public Property Let Obj(ByVal NewNumber As Integer) a = NewNumber End Property 上のマクロではやり取り1変数になってますがこれを配列に変えたいのですがどうすればいいでしょうか?

  • Excel VBA 複数のSheet の合計

    Excel VBA  超超 初心者です。見よう見まねで、複数のSheet の L11:Q1000 ,T1:AW100 セル範囲にある文字 "&#65374;" を計算できたのですが、 更に各Sheet で計算された合計をしたいのですが、さっぱり判りません。Sheet 名は、バラバラです。合計は、最初か最後のsheet のどこかのセルに表示させたいです。どなたかヒントをてください。よろしくお願いします。 Sub すべてのシートでマクロ実行() Application.ScreenUpdating = False Dim シート As Worksheet For Each シート In Worksheets シート.Select Range("H3").Select ActiveCell.FormulaR1C1 = "=COUNTIF(R[8]C[4]:R[997]C[9],""*&#65374;*"")" Range("I3").Select ActiveCell.FormulaR1C1 = "=COUNTIF(R[-2]C[11]:R[997]C[40],""*&#65374;*"")" Range("I4").Select Next Application.ScreenUpdating = True End Sub

  • excel2007マクロに関しまして

    excel2007マクロに関して不明な点があるので教えて頂きたいです。 シートが50枚ありそれぞれのシートのN列4&#65374;15行に対し そのシートのC列4&#65374;15行の値を60倍したものを記載したいのですが 下記入力内容中の Range("N " & j ).Select のところでRange メソッドの失敗が生じてしまいます。 その他にも不備があればご指摘頂きたいです。 宜しくお願いします。 Sub Macro6() ' ' Macro6 Macro ' Dim i, j As Integer For i = 1 To 50 With Sheets("ds1_" & i) Range("N3").Select ActiveCell.FormulaR1C1 = "Q(cum/m)" For j = 4 To 15 Range("N " & j ).Select ActiveCell.FormulaR1C1 = "=RC[-11]*60" Next j End With Next i End Sub