Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4324 / 13644 ツリー ←次へ | 前へ→

【57295】構造体およびEnumの使い方 satsuki 08/8/5(火) 14:54 質問[未読]
【57298】Re:構造体およびEnumの使い方 mizunu 08/8/5(火) 16:22 回答[未読]
【57306】Re:構造体およびEnumの使い方 satsuki 08/8/5(火) 23:13 質問[未読]
【57299】Re:構造体およびEnumの使い方 neptune 08/8/5(火) 16:22 発言[未読]
【57305】Re:構造体およびEnumの使い方 satsuki 08/8/5(火) 20:50 発言[未読]

【57295】構造体およびEnumの使い方
質問  satsuki  - 08/8/5(火) 14:54 -

引用なし
パスワード
   スレッド57227のところで教えて頂いたコードの一部を研究中です。
いろいろご指摘頂いた点、まだ対応できていないかもしれませんが、
ネットで調べてみても見つからず、前に進めません。
どなたかご教示お願いいたします。

Private Enum TargetTableName
  店別来店数
  店別製品別売上数
  店別個人別売上数
End Enum

Private Type RecordData
  日付 As Date
  店名 As String
  人数 As Long
  製品名 As String
  担当名 As String
  台数 As Long
End Type

Private Sub InsertMain()
Dim Cn As ADODB.Connection
Dim cnString As String
Dim typData() As RecordData
Dim fNum As Long
Dim Ret As Boolean
Const csvpath As String = "E:\Data\Office\Access\TestData.csv"

Dim Title(2) As String
Dim TitleName As String
Dim TableName(2) As String
Dim InputTable As String
Dim i As long
Dim j As long

Title(0) = "1.店別来店数"
Title(1) = "2.店別製品別売上数"
Title(2) = "3.店別個人別売上数"

TableName(0) = 店別来店数
TableName(1) = 店別製品別売上数
TableName(2) = 店別個人別売上数

TitleName = Title(0)
InputTable = TableName(0)
i = 0

On Error GoTo ErrTrap
  Set Cn = New ADODB.Connection
  cnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data   
  Source=C:\hogehogeDirctory\Test.mdb;"
  Cn.ConnectionString = cnString
  Cn.Open
 
Dim objsheet As Worksheet
  Set objsheet = Worksheets("sheet1")
  
objsheet.Range("A1").Select

ReDim typData(6 To objsheet.Cells(Rows.Count, 1).End(xlUp).Row)

For j = 6 To objsheet.Cells(Rows.Count, 1).End(xlUp).Row
  If objsheet.Cells(j, 1).Value = Title(i) Then
    TitleName = Title(i)
    InputTable = TableName(i) 3.
    i = i + 1
    j = j + 1
  End If

    typData(j).日付 = Cells(2, 1)
    typData(j).店名 = Cells(j, 1)
    typData(j).人数 = Cells(j, 2)
    
  Ret = InSertData(TargetTableName.店別来店数, typData, Cn)2.
 
Next j
  Cn.Close
  Set Cn = Nothing
  Exit Sub
ErrTrap:
  MsgBox "Err No: " & Err.Number & vbTab & Err.Description
End Sub

Private Function InSertData(ptbl As TargetTableName, pRec() As RecordData, pCn As ADODB.Connection) As Boolean
  Dim sSQL As String
  Dim Cmd As ADODB.Command

  sSQL = "INSERT INTO "
  'SQL生成
  Select Case ptbl
    Case TargetTableName.店別来店数
      '個別のSQL生成 1.
      sSQL = sSQL & ptbl & "(日付,店名,人数)" & _
          " VALUES(#" & pRecpRec(j).日付 & "#,'" &
          pRecpRec(j).店名 & "'," &
          pRecpRec(j).人数 & ")"
    Case TargetTableName.店別個人別売上数
    Case TargetTableName.店別製品別売上数
  End Select
'  Commandオブジェクト生成
  'command実行
  
End Function


1.sSQL = sSQL & ptbl & "(日付,店名,人数)" & _
   " VALUES(#" & pRec(j).日付 & "#,'" & pRec(j).店名 & "'," &           pRec(j).人数 & ")"
のところで「インデックスが有効範囲にありません」というエラーがでます。
どこを直したらよいでしょうか?

2.Ret = InSertData(TargetTableName.店別来店数, typData, Cn)
後、上記のコードのところで、Enumの値を動的に変える方法はありますでしょうか?
3.InputTable = TableName(i)で、テーブル名をデータの内容ごとに変えるようにしてありますが、Enumで列挙されているテーブル名をまた配列で列挙しているのもムダな気がします。Enumの上手な使い方をどなたかご教示お願いいたします。

【57298】Re:構造体およびEnumの使い方
回答  mizunu  - 08/8/5(火) 16:22 -

引用なし
パスワード
   さっと目を通しただけですが...
>1.
モジュールの先頭にOption Explicitを記述し、コンパイルすると原因が分かるでしょう。

2.
Enum ステートメントのヘルプをご覧下さい。
列挙型の要素は、Enum ステートメントにおいて指定された定数値に初期化されます。割り当てられた値は、実行時には変更できません。

3.
InputTableはどこに使っているのでしょう?
InputTable = TableName(i)
i=0のときInputTableの値に何が入ると期待していますか?

【57299】Re:構造体およびEnumの使い方
発言  neptune  - 08/8/5(火) 16:22 -

引用なし
パスワード
   ▼satsuki さん:
こんにちは

今回のResはキツ目なので先にお詫びしておきます。

細かく見てませんが、
>1.sSQL = sSQL & ptbl & "(日付,店名,人数)" & _
>   " VALUES(#" & pRec(j).日付 & "#,'" & pRec(j).店名 & "'," &           pRec(j).人数 & ")"
>のところで「インデックスが有効範囲にありません」というエラーがでます。
>どこを直したらよいでしょうか?
私は、大体の流れしか書いてない、確認もしてないとサンプルをUPしたとき
書いています。
大体、InSertDataで、変数jを扱う処理は書かれてないでしょ。
それぐらいは自分で改造、デバッグてください。

人に使ってもらうプログラムを書く人なのであえて、技術系の板のキツサで
書きますが、その程度のデバッグも出来ないなら、私の書いたサンプルは忘れて、
ご自分の理解の範囲で書いて下さい。若しくはあきらめて下さい。
・・・これぐらいで止めておきます。m(_ _)m

※↓はエラーとは関係ないとは思いますが、一応書いておきます。
※上のSQLはテーブルの構造、データ型、などが開示されてない為、想像で
書いてます。従って、文法自体はあっていると思いますが、動くかどうかは
私には判りません。

>2.Ret = InSertData(TargetTableName.店別来店数, typData, Cn)
>後、上記のコードのところで、Enumの値を動的に変える方法はありますでしょうか?
ありません。
但し、Helpを見れば判りますが、Enumのメンバは0から始まる数値です。

>3.InputTable = TableName(i)で、テーブル名をデータの内容ごとに変えるように
>してありますが、Enumで列挙されているテーブル名をまた配列で列挙しているの
>もムダな気がします。Enumの上手な使い方をどなたかご教示お願いいたします。
細かく目を通してないのでこれに付いてはパス。

でも、前にサンプルをUPした後、一度に複数のテーブルのデータを取得した方が
合理的だったなと気が付き、ClassかCollectionにした方が良かったかなとは
思っていました。

ご自分の理解の範囲で、適当に工夫して下さい。

別にEnum、構造体に、固執する事は無いです。自分のわかりやすい方法で
やられては?
Enumは間違い防止、インテリジェンス機能の利用をしたら楽チンという理由で
使用しています。構造体は、RecordSetのデータを扱う際の常套手段です。

【57305】Re:構造体およびEnumの使い方
発言  satsuki  - 08/8/5(火) 20:50 -

引用なし
パスワード
   ▼neptune さん:
レスありがとうございます。

>人に使ってもらうプログラムを書く人なのであえて、技術系の板のキツサで
>書きますが、その程度のデバッグも出来ないなら、私の書いたサンプルは忘れ
>て、ご自分の理解の範囲で書いて下さい。若しくはあきらめて下さい。

あの、今回はあくまでお勉強です。自分の理解の範囲だけでは進歩がないので、
教えて頂いたサンプルを完成させてみようと思っているだけなのです。
neptuneさんは、サンプルプログラムに関して責任を感じて頂く必要はありません。

>>2.Ret = InSertData(TargetTableName.店別来店数, typData, Cn)
>>後、上記のコードのところで、Enumの値を動的に変える方法はありますでしょうか?
>ありません。
>但し、Helpを見れば判りますが、Enumのメンバは0から始まる数値です。

その0から始まる数値を使えないかなと思って質問してみました。

>ご自分の理解の範囲で、適当に工夫して下さい。
>別にEnum、構造体に、固執する事は無いです。自分のわかりやすい方法で
>やられては?

とにかく勉強のためなので、固執してはいないです。
実際に上手くできれば、新しい方法を使うかもしれないし、だめなら以前の方法でいきます。

>Enumは間違い防止、インテリジェンス機能の利用をしたら楽チンという理由で
>使用しています。構造体は、RecordSetのデータを扱う際の常套手段です。

Enumは、後で定数の値が変わったときに、直しやすいというのはどこかで見ました。それだけだともったいないと思っただけです。

【57306】Re:構造体およびEnumの使い方
質問  satsuki  - 08/8/5(火) 23:13 -

引用なし
パスワード
   ▼mizunu さん:
>モジュールの先頭にOption Explicitを記述し、コンパイルすると原因が分かるでしょう。
レスありがとうございました。コンパイルした結果、jのところでエラーが出ていたので、下記のように変更したら作動しました。

Ret = InSertData(TargetTableName.店別来店数, typData, Cn)

Ret = InSertData(TargetTableName.店別来店数, typData, Cn, j)

Private Function InSertData(ptbl As TargetTableName, pRec() As RecordData, pCn As ADODB.Connection) As Boolean

Private Function InSertData(ptbl As TargetTableName, pRec() As RecordData, pCn As ADODB.Connection, j as long) As Boolean

>Enum ステートメントのヘルプをご覧下さい。
>列挙型の要素は、Enum ステートメントにおいて指定された定数値に初期化されます。割り当てられた値は、実行時には変更できません。

配列のように、その割り当てられた値で、Functionに入る
Ret = InSertData(TargetTableName.店別来店数, typData, Cn)
のときにテーブル名を変える方法はありますか?

>InputTableはどこに使っているのでしょう?
上記の方法が不可能であれば、
Ret = InSertData(TargetTableName.店別来店数, typData, Cn)
の「TargetTableName.店別来店数」の代わりに使うべきかと思い、入れてあります。

>InputTable = TableName(i)
>i=0のときInputTableの値に何が入ると期待していますか?
TableName(0) = 店別来店数
というふうに配列に設定してありますので、
InputTableの値には「店別来店数」が入っています。

4324 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free