Excel VBA質問箱 IV

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

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


8776 / 13646 ツリー ←次へ | 前へ→

【31051】ランダムファイルからのコンボボックスへのアイテム追加 HANA 05/11/10(木) 9:55 質問[未読]
【31103】Re:ランダムファイルからのコンボボックス... Jaka 05/11/11(金) 16:34 発言[未読]
【31145】Re:ランダムファイルからのコンボボックス... HANA 05/11/12(土) 14:01 発言[未読]
【31146】Re:ランダムファイルからのコンボボックス... Kein 05/11/12(土) 14:45 発言[未読]
【31149】Re:ランダムファイルからのコンボボックス... よろずや 05/11/12(土) 17:03 発言[未読]
【31150】Re:ランダムファイルからのコンボボックス... ichinose 05/11/12(土) 17:34 発言[未読]
【31220】Re:ランダムファイルからのコンボボックス... HANA 05/11/15(火) 8:23 お礼[未読]
【31221】ごめんなさい やっぱりダメでした HANA 05/11/15(火) 9:03 質問[未読]
【31222】Re:ごめんなさい やっぱりダメでした ichinose 05/11/15(火) 9:34 発言[未読]
【31223】Re:ごめんなさい やっぱりダメでした HANA 05/11/15(火) 10:20 質問[未読]
【31263】Re:ごめんなさい やっぱりダメでした ichinose 05/11/16(水) 0:46 発言[未読]
【31264】大変勉強になりました HANA 05/11/16(水) 8:41 お礼[未読]

【31051】ランダムファイルからのコンボボックスへ...
質問  HANA  - 05/11/10(木) 9:55 -

引用なし
パスワード
   エクセルシートに配置したコンボボックスのリストアイテムに
ランダムファイルの項目を設定したいのですが、どのようにすればよろしいのでしょうか?
ランダムファイルは以下のような感じで構成されてます
Public Type DB1
    工事番号 As String * 5
    工番2 As String * 2
    発注者 As String * 36
      ・
      ・
      ・
    削除FLG As String * 2
End Type

【31103】Re:ランダムファイルからのコンボボック...
発言  Jaka  - 05/11/11(金) 16:34 -

引用なし
パスワード
   こんにちは。
なかなか回答がつかないようですが、質問の意味が良く解りません。
Typeって、使うと便利らしいみたいですが、便利性が良く解らないので使った事無いです。
Typeを使わないとダメなのでしょうか?
(配列の中に配列をいれると言った、興味本位でテストした時に1度だけ使った事があるだけです。)

一応、全然参考にならないコード。
こういう事なのでしょうか?

Public Type DB1
    工事番号 As String * 5
    工番2 As String * 2
    発注者 As String * 36
    削除FLG As String * 2
End Type

Sub KH250()
Dim DB1 As DB1
DB1.工事番号 = "AAAA"
DB1.工番2 = "BB"
DB1.発注者 = "あああああ"
DB1.削除FLG = "OK"
With Worksheets("Sheet1").OLEObjects("ComboBox1").Object
  .AddItem DB1.工事番号
  .AddItem DB1.工番2
  .AddItem DB1.発注者
  .AddItem DB1.削除FLG
End With
End Sub

【31145】Re:ランダムファイルからのコンボボック...
発言  HANA  - 05/11/12(土) 14:01 -

引用なし
パスワード
   Jaka さん返信ありがとうございます
質問の要領が悪くてごめんなさい
1.現在、エクセルのユーザーフォーム(USERFORM1)にComboBox1を
 配置しています
2.ActiveWorkbookと同じフォルダ内にある別の
 ランダムファイル"DB1.dat"が存在します
 DB1.datのレコード構成がTYPE DB1 になっています

DB1.datファイルを”読んで”DB1.datの工事番号5文字と工番2の2文字を組み合わせた7文字を1.で配置したComboBox1のアイテムとして登録するのにはどうすればいいのかわからなかったんです。
ランダムファイルなので、TYPEを使ってやったんですけど(汗
最初の質問では、シートに貼り付けたコンボボックスになっていましたね
それで
>With Worksheets("Sheet1").OLEObjects("ComboBox1").Object
なんですね。このOLEObjectsの用語すらわからなかったので、
この部分だけでも大収穫です。
もし、ランダムファイルの全件読み出ししながら所定の項目を逐次なり
一括なりでコンボボックスにアイテム追加する(していく)方法が
あれば、ご教授をお願いできないでしょうか
お願いいたします。

【31146】Re:ランダムファイルからのコンボボック...
発言  Kein  - 05/11/12(土) 14:45 -

引用なし
パスワード
   まずそのファイルをエクセルで開いてみて下さい。テキストファイルウィザードという
ダイアログが出ませんか ? 出ないようなら拡張子を txt に変更してから開きます。
ダイアログが出るのを確認したらいったんキャンセルで閉じ、マクロの自動記録を
ON にしてから改めて開きます。そのとき「スペースによって右または左に揃えられた
固定長フィールドのデータ」にチェックを付けて下さい。そうして次のウィンドウで、
文字数によって区切り線を入れてからファイルを開きます。セル毎に分割した状態
で開かれると思います。そこでマクロの記録を OFF にしてコードを見ると、
OpenTextメソッドの引数 FieldInfo に対して Array関数を使った配列が
渡されてるのが分かるはずです。それが固定長ファイルの区切り位置を示して
いるので、次回に Openステートメントでランダムアクセスするコードの情報
として使えるようになります。しかし、いったんうまくエクセルで開くことが
出来たわけですから、それを使ってセル毎に区切られたデータを、ComboBoxに
リストとして読み込んでも良いでしょうね。その場合はもちろん ListFillRange
は使えません。リストに読み込んだら元ファイルを閉じてしまうわけですから、
AddItem でリスト登録していくのが正解です。
ま、色々と解説する前に、ここまでのことをテストしてみて下さい。

【31149】Re:ランダムファイルからのコンボボック...
発言  よろずや  - 05/11/12(土) 17:03 -

引用なし
パスワード
   >もし、ランダムファイルの全件読み出ししながら所定の項目を逐次なり
>一括なりでコンボボックスにアイテム追加する(していく)方法が

(1) ランダムファイルを読む
(2) 文字列を結合する
(3) コンボボックスにアイテム追加する
の全部が分からない訳ではないんでしょ。
自分で書いたコードを提示して、
どこが分からないのかを書きましょう。

【31150】Re:ランダムファイルからのコンボボック...
発言  ichinose  - 05/11/12(土) 17:34 -

引用なし
パスワード
   みなさん、こんばんは。
再送です。久しぶりのランダムファイルで勘違いしてたところもあったので・・。


>の全部が分からない訳ではないんでしょ。
>自分で書いたコードを提示して、
>どこが分からないのかを書きましょう。
私もそう思います。

例えば、HANAさんの例を具体的にして、標準モジュールに
'======================================
Type db1
  工事番号 As String * 5
  工番2 As String * 2
  発注者 As String * 36
  End Type
'====================================
Sub mk_sample_file()
  On Error Resume Next
  Const fllen = 43
  Dim flno As Long
  Dim rec As db1
  Dim KoujiNO As Variant
  Dim kouban2 As Variant
  Dim hachu As Variant
  KoujiNO = Array("00001", "00010", "00030")
  koubann2 = Array("01", "10", "20")
  hachu = Array("宇多田ヒカル", "浜崎あゆみ", "中島美嘉")
  flno = FreeFile
  Kill ThisWorkbook.Path & "\db1.dat"
  Open ThisWorkbook.Path & "\db1.dat" For Random As #flno Len = fllen
  For idx = LBound(KoujiNO) To UBound(KoujiNO)
   With rec
     .工事番号 = KoujiNO(idx)
     .工番2 = koubann2(idx)
     .発注者 = hachu(idx)
     End With
   Put #flno, , rec
   Next idx
  Close #flno
End Sub
とすれば、レコード長=43のランダムファイルが作成されます。

これを
ユーザーフォーム(Userform1)の
コンボボックス(ComboBox1)に反映させるには

Useform1のモジュールに
'===================================================
Private Type db2
  工事番号 As String * 5
  工番2 As String * 2
  発注者 As String * 36
  End Type
'==================================================
Sub read_sample_file()
  On Error Resume Next
  Dim flno As Long
  Dim rec As db2
  Dim idx As Long
  Const fllen = 43
  flno = FreeFile
  ComboBox1.ColumnCount = 2
  Open ThisWorkbook.Path & "\db1.dat" For Random As #flno Len = fllen
  For idx = 1 To LOF(flno) / fllen
   Get #flno, , rec
   With rec
     MsgBox "工事番号 ---" & .工事番号 & vbCrLf & _
        "工番2  ---" & .工番2 & vbCrLf & _
        "発注者  ---" & .発注者
'     確認のため表示させました。↑実際は削除
     ComboBox1.AddItem .工事番号
     ComboBox1.List(idx - 1, 1) = .工番2
     End With
   Next
  Close #flno
End Sub
'==========================================================
Private Sub UserForm_Initialize()
  Call read_sample_file
End Sub


新規ブックにユーザーフォームとコードをコピーして確認してください。
但し、一度保存してから実行してください(Thisworkbook.Pathを使っているので)。

【31220】Re:ランダムファイルからのコンボボック...
お礼  HANA  - 05/11/15(火) 8:23 -

引用なし
パスワード
   ▼ichinose さん みなさん、こんばんは
要領の悪い質問に、親切に回答いただきましてありがとうございます
>>の全部が分からない訳ではないんでしょ。
>>自分で書いたコードを提示して、
>>どこが分からないのかを書きましょう。
と言っていただけたので、ichinoseさんや皆さんのアドバイスを参考にコードを作成してみました
シート”工番"にComboBox1を配置した形でやってみました

<標準モジュールで>
Public 検索キー As Variant
Public TDB2 As DB1
Public intFF As Integer
Public maxR As Long
Const PA = "C:\Documents and Settings\xxxx\デスクトップ\接続TEST\TDB2"

Public i As Integer, RC As Long, j As Integer, C As Integer
Public Type DB1
    工事番号 As String * 5
    工番2 As String * 2
    発注者 As String * 36
    工期1 As String * 10
    工期2 As String * 10
    工事名 As String * 60
    工事場所 As String * 100
    請負金額  As String * 12
    請負消費税 As String * 8
    申請部署 As String * 2
    現場代理人 As String * 20
    申請日 As String * 10
    先方担当 As String * 16
    当社担当 As String * 16
    前払金 As String * 10
    契約日 As String * 8
    契約No As String * 20
    条件 As String * 60
    特記事項1 As String * 60
    特記事項2 As String * 60
    削除FLG As String * 2
End Type


Sub READ_DB1()
intFF = FreeFile
i = 1
  Open PA For Random As intFF Len = Len(TDB2)
  maxR = LOF(intFF) / Len(TDB2)
Do While maxR + 1 > i
    Get #intFF, i, TDB2
    If TDB2.削除FLG <> "" Then
      With Worksheets("工番").OLEObjects("ComboBox1").Object
      .AddItem TDB2.工事番号
      .List(i - 1, 1) = TDB2.工番2
      End With
    End If
    i = i + 1
Loop
Close #intFF
End Sub

で、なんとかいけました
どうもありがとうございました

【31221】ごめんなさい やっぱりダメでした
質問  HANA  - 05/11/15(火) 9:03 -

引用なし
パスワード
   >Sub READ_DB1()
>intFF = FreeFile
>i = 1
>  Open PA For Random As intFF Len = Len(TDB2)
>  maxR = LOF(intFF) / Len(TDB2)
>Do While maxR + 1 > i
>    Get #intFF, i, TDB2
>    If TDB2.削除FLG <> "" Then
>      With Worksheets("工番").OLEObjects("ComboBox1").Object
>      .AddItem TDB2.工事番号
>      .List(i - 1, 1) = TDB2.工番2
>      End With
>    End If
>    i = i + 1
>Loop
>Close #intFF
>End Sub
>
で、なんとかいけたつもりだったんですが・・・・
同じComboBox1のリストは同一番号が件数分並んでいるだけなんです
そこで、いったんリストをクリアする方法にかきなおしたのですが

Sub READ_DB1()
Worksheets("工番").OLEObjects("ComboBox1") _
  .Item.Clear
★このコマンドをサポートしていませんのエラー
intFF = FreeFile
i = 1
  Open PA For Random As intFF Len = Len(TDB2)
  maxR = LOF(intFF) / Len(TDB2)
Do While maxR + 1 > i
    Get #intFF, i, TDB2
    If TDB2.削除FLG = "" Then
      With Worksheets("工番").OLEObjects("ComboBox1").Object
      .AddItem TDB2.工事番号
      .List(i - 1, 1) = TDB2.工番2
      End With
    End If
    i = i + 1
Loop
Close #intFF
End Sub
になってしまいます。再三のお願いで申し訳ないのですが、再度ご教授お願い
できませんでしょうか。

【31222】Re:ごめんなさい やっぱりダメでした
発言  ichinose  - 05/11/15(火) 9:34 -

引用なし
パスワード
   おはようございます。

>同じComboBox1のリストは同一番号が件数分並んでいるだけなんです
↑この意味がわかりませんが、下のコードはデータの追加に絶えうるようには
なっていませんね?で、最初に初期化ということなら・・・。
>そこで、いったんリストをクリアする方法にかきなおしたのですが
>
>Sub READ_DB1()
>Worksheets("工番").OLEObjects("ComboBox1") _
  .object.Clear
'これです。
>★このコマンドをサポートしていませんのエラー
>intFF = FreeFile
>i = 1
>  Open PA For Random As intFF Len = Len(TDB2)
>  maxR = LOF(intFF) / Len(TDB2)
>Do While maxR + 1 > i
>    Get #intFF, i, TDB2
>    If TDB2.削除FLG = "" Then
>      With Worksheets("工番").OLEObjects("ComboBox1").Object
>      .AddItem TDB2.工事番号
>      .List(i - 1, 1) = TDB2.工番2
>      End With
>    End If
>    i = i + 1
>Loop
>Close #intFF
>End Sub
>になってしまいます。再三のお願いで申し訳ないのですが、再度ご教授お願い
>できませんでしょうか。
出かけてしまうので、これでうまくいかない場合は、
どなたかお願いします。

【31223】Re:ごめんなさい やっぱりダメでした
質問  HANA  - 05/11/15(火) 10:20 -

引用なし
パスワード
   ▼ichinose さん:

>>Sub READ_DB1()
>>Worksheets("工番").OLEObjects("ComboBox1") _
>  .object.Clear
>'これです。
おかげさまで、リスト表示は正常になりました
しかし
>コードはデータの追加に絶えうるようにはなっていませんね?
ご指摘のように
 このシート上から新規工番を追加した場合ComboBoxのリストはそれを反映しない
という問題が残ります。追加をするたびにAddItemするのでしょうか?また、削除FLGのたっているレコードはリストに出さないようにしているのですが、その時にはクリアしてまた読み直す作業が必要でしょうか?
 効率の良い方法がありましたら、ご指導お願いします。

【31263】Re:ごめんなさい やっぱりダメでした
発言  ichinose  - 05/11/16(水) 0:46 -

引用なし
パスワード
   ▼HANA さん:
こんばんは。
>Sub READ_DB1()
>Worksheets("工番").OLEObjects("ComboBox1") _
  .object.Clear 'これを入れる仕様が本来のものなのか?が不明ですが・・。
'付けた時とはずしたときで試して下さい
>'れです。
>'このコマンドをサポートしていませんのエラー
>intFF = FreeFile
>i = 1
>  Open PA For Random As intFF Len = Len(TDB2)
>  maxR = LOF(intFF) / Len(TDB2)
>Do While maxR + 1 > i
>    Get #intFF, i, TDB2
     if trim(TDB2.削除FLG) <> "" Then
      '↑Trim関数を使わないで削除の判断ができますか?
>      With Worksheets("工番").OLEObjects("ComboBox1").Object
>      .AddItem TDB2.工事番号
      .List(.listcount - 1, 1) = TDB2.工番2
>      End With
>    End If
>    i = i + 1
>Loop
>Close #intFF
>End Sub
これで確認してみて下さい。

ところで・・・。
Public Type DB1
の構成を見ると、全部文字列型ですよね?
何のためのランダムファイルなんですか?
データ保護ですか?
でも、中身が文字列では、見当はつけ易いよね?
これ、ランダムファイルで回すより、
単純にCSVファイルのようなテキストファイルにしたほうが
処理は速いですよ!!

【31264】大変勉強になりました
お礼  HANA  - 05/11/16(水) 8:41 -

引用なし
パスワード
   ▼ichinose さん みなさん
お忙しいところ、親身のご指導ありがとうございました
回答いただいたみなさんそれぞれの回答ごとに知らなかったことを教えていただいて感謝しています。
ichinoseさんの
>  .object.Clear 'これを入れる仕様が本来のものなのか?が不明です・・。
>'付けた時とはずしたときで試して下さい
無しでもOKでした。

>     if trim(TDB2.削除FLG) <> "" Then
>      '↑Trim関数を使わないで削除の判断ができますか?
うっかりTrim忘れていて ご指摘ありがとうございます
>       .List(.listcount - 1, 1) = TDB2.工番2
このlistcountの部分、今回特に勉強になりました(知らなかったです)
>ところで・・・。
>Public Type DB1
>の構成を見ると、全部文字列型ですよね?
他の型を使ったとき長さがどうなるかまだ不勉強だったので、文字列にしました
>何のためのランダムファイルなんですか?
>データ保護ですか?
CSVより早いかなと思ったのと、今後このファイルをSQLサーバーに置き換えて
フロントエンドをxlsでクラサバにしていくのに、テーブル設定しやすいかとの
安易な考えでした
>でも、中身が文字列では、見当はつけ易いよね?
>これ、ランダムファイルで回すより、
>単純にCSVファイルのようなテキストファイルにしたほうが
>処理は速いですよ!!
早速CSVの勉強をして、そちらに変更してやってみます
ComboBoxの取り扱いについての私の理解はまだまだ不十分ですが、
とりあえず今回の問題点の解決ができました。
今後ともよろしくお願いします

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