Excel VBA質問箱 IV

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

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


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

【57263】ユーザー定義型の変数に値を入れる satsuki 08/8/4(月) 2:42 質問[未読]
【57265】Re:ユーザー定義型の変数に値を入れる かみちゃん 08/8/4(月) 7:06 発言[未読]
【57278】Re:ユーザー定義型の変数に値を入れる satsuki 08/8/4(月) 19:55 お礼[未読]
【57269】Re:ユーザー定義型の変数に値を入れる neptune 08/8/4(月) 11:40 発言[未読]
【57279】Re:ユーザー定義型の変数に値を入れる satsuki 08/8/4(月) 19:59 お礼[未読]

【57263】ユーザー定義型の変数に値を入れる
質問  satsuki  - 08/8/4(月) 2:42 -

引用なし
パスワード
   こんにちは、Satsukiと申します。
スレッド57227のところで教えて頂いたコードの一部を研究中です。
まだほとんどできていないので、できている部分だけを書きます。

↓下記のようにユーザー定義型が定義されていて
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"

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
  
For j = 1 To objsheet.Cells(Rows.Count, 1).End(xlUp).Row

    typData(1).店名 = Cells(j, 1)
    typData(2).人数 = Cells(j, 2)
    
Next j
  Cn.Close
  Set Cn = Nothing
  Exit Sub
ErrTrap:
  '必要なエラー処理
End Sub

何も動作せずにend subに飛んでしまいます。
typData(1).店名 = Cells(j, 1)のところを見ると、
「インデックスが有効範囲にありません」と出ています。
どこを直したらよいでしょうか?
どなたかご教示お願いいたします。

【57265】Re:ユーザー定義型の変数に値を入れる
発言  かみちゃん E-MAIL  - 08/8/4(月) 7:06 -

引用なし
パスワード
   こんにちは。かみちゃん です。

取り急ぎ。

>typData(1).店名 = Cells(j, 1)のところを見ると、
>「インデックスが有効範囲にありません」と出ています。
>どこを直したらよいでしょうか?

以下のようなサンプルを一度試してみていただけますか?

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

Sub Sample()
 Dim typData() As RecordData

 ReDim typData(1 To 2)
' ReDim typData(1 To objsheet.Cells(Rows.Count, 1).End(xlUp).Row)
  
 typData(1).店名 = "A"
 typData(1).人数 = 10
 typData(2).店名 = "B"
 typData(2).人数 = 13
 
 MsgBox typData(1).店名 & " " & typData(1).人数 & vbCrLf & _
     typData(2).店名 & " " & typData(2).人数
End Sub

ユーザー定義型については、以下のURLも参考になると思います。
http://www.officetanaka.net/excel/vba/statement/Type.htm

【57269】Re:ユーザー定義型の変数に値を入れる
発言  neptune  - 08/8/4(月) 11:40 -

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

原因に関しましては既にかみちゃんさんのご説明がありますので
省略します。

ユーザー定義型(構造体)の使い方に付いては以下をどうぞ。
KOZの館
h tp://www.interq.or.jp/www-user/komurak/
Visual Basic プログラミングテクニック
の1〜3は必読

人に使ってもらうプログラムを書くなら最低限以下もお読みになって
おくべきかと思います。
「CavalierLab」
h tp://homepage1.nifty.com/CavalierLab/
Visual Basic 6 基礎講座
   言語の基礎の「構造体の目的と利用方法」
   コーディングの基礎の「省略してはいけない 」

気付いた点
・せめてプログラム作成段階では
  '必要なエラー処理
の所に
MsgBox "Err No: " & Err.Number & vbTab & Err.Description
とか
debug.print "Err No: " & Err.Number & vbTab & Err.Description
など何のエラーかがわかるようにすることが必要ですよ。

参考:もっと規模がでかくなれば、エラー表示部分は別プロシージャに
まとめてしまうこともあります。

又、
Set Cn = Nothing
は必須です。

・ちなみに、構造体に格納する部分を別ファンクション、プロシージャにしておけば、ADO関連の
オブジェクトに気を使わずにデバッグできます。(改造の際もそのfunctionを改造すれば良い)

【57278】Re:ユーザー定義型の変数に値を入れる
お礼  satsuki  - 08/8/4(月) 19:55 -

引用なし
パスワード
   ▼かみちゃん さん:

ありがとうございます。Redimを使ったらできました。

ちなみに
ReDim typData(1 To objsheet.Cells(Rows.Count, 1).End(xlUp).Row)
が↓に変わると、
ReDim typData(kiten2.Row + 1 To objsheet.Cells(Rows.Count, 1).End(xlUp).Row)

typData()も同じように変えるのですね。

For j = kiten2.Row + 1 To objsheet.Cells(Rows.Count, 1).End(xlUp).Row
 typData(kiten2.Row + 1).店名 = Cells(j, 1)
 typData(kiten2.Row + 1).人数 = Cells(j, 2)

>ユーザー定義型については、以下のURLも参考になると思います。
>http://www.officetanaka.net/excel/vba/statement/Type.htm
ありがとうございます。こちらのページは私も見ておりました。

【57279】Re:ユーザー定義型の変数に値を入れる
お礼  satsuki  - 08/8/4(月) 19:59 -

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

>h tp://www.interq.or.jp/www-user/komurak/
>h tp://homepage1.nifty.com/CavalierLab/
上記URLとても参考になりました。ありがとうございます。

>・せめてプログラム作成段階では
>  '必要なエラー処理
>の所に
>何のエラーかがわかるようにすることが必要ですよ。
すいません。後で余裕がきたら考えようと思っておりました。
教えて頂いて助かりました。


>・ちなみに、構造体に格納する部分を別ファンクション、プロシージャにしておけば、ADO関連の
>オブジェクトに気を使わずにデバッグできます。(改造の際もそのfunctionを改造すれば良い)
なるほど。上記URLの例を見てみても、とても見やすいのがわかりました。
今後は心がけたいと思います。

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