環境:Win2000 VB6.0
さっそく質問させていただきます。
実行時にExcelファイルを読込んでListViewに表示をさせたいのですが
どうやったらいいの教えてください。
これではいけないと思い
もう一度書きます。
Excelファイルのオープン→ListViewにセット→Excelファイルの解放
このような手順でよろしいのですか?
Excelファイルのオープンと解放はなんとか調べて
思い通りになりそうです。
ですが、ListViewにセットするところがどうしても
わかりませんので教えていただけないでしょうか?
ListItemsプロパティ、ColumnHeadersプロパティ、それに関するメソッド
等を調べてみてはいかがでしょう?
レスありがとうございます。
VBレスキュー(花ちゃん)のページでExcelファイルを読み込んで
TextBoxに表示というのを見つけたのですが、
これはTextBoxではなく、ListViewに表示というのは
可能ですか?
http://www.bcap.co.jp/hanafusa/
(DAOを使ってExcelデータを読み込みテキストボックスに表示・他)
もし可能でしたらどのようにしたらいいのか
参考にヒントを頂けないでしょうか?
Option Explicit
'1.DAOでExcelファイルを読み込みテキストボックスに表示
Private Sub Command1_Click()
Dim DB As DAO.Database
Dim RS As DAO.Recordset
Dim xlFileName As String
Dim xlSheetName As String
Dim MyData As String
'読込用のExcelファイル(パスを間違えないように)
xlFileName = App.Path & "\Sample.xls"
xlSheetName = "Sheet1" & "$"
'データベース(xlFileName)のオープン(HDR=NO で項目を読込まない)
Set DB = OpenDatabase(xlFileName, False, False, "Excel 8.0;HDR=NO;")
'Recordsetオブジェクトのオープン
Set RS = DB.OpenRecordset(xlSheetName)
'末尾レコードまでのデータを読込
Do Until RS.EOF
With RS
'A列・B列・C列のデータを取得
MyData = MyData & .Fields(0) & vbTab & .Fields(1) & _
vbTab & .Fields(2) & vbCrLf
.MoveNext '次のレコードに移動
End With
Loop
'取得したデータをテキストボックスに表示
Text1.Text = MyData
RS.Close
DB.Close
Set RS = Nothing
Set DB = Nothing
End Sub
'2.DAOによるExcel用データの編集
Private Sub Command2_Click()
'B列の3行目のセルの内容を書換
Dim DB As DAO.Database
Dim RS As DAO.Recordset
Dim xlFileName As String
Dim xlSheetName As String
xlFileName = App.Path & "\Sample.xls"
xlSheetName = "Sheet1" & "$"
Set DB = OpenDatabase(xlFileName, False, False, "Excel 8.0;HDR=NO;")
Set RS = DB.OpenRecordset(xlSheetName)
With RS
.MoveFirst
.Move CLng(2) '3行目に移動
.Edit '現在ポイントされている行の編集開始
.Fields(1) = Text2.Text 'B列を編集
.Update '編集終了
.Close
End With
DB.Close
Set RS = Nothing
Set DB = Nothing
Command1.Value = True
End Sub
'3.DAOによるExcelファイルのシート名の読込
Private Sub Command3_Click()
'Excelのシート名及びシート数を高速に取得
Dim DB As DAO.Database
Dim Tbl As DAO.TableDef
Dim xlFileName As String
Dim nCount As Long
List1.Clear
List1.Visible = False
xlFileName = App.Path & "\Sample.xls"
Set DB = OpenDatabase(xlFileName, True, True, "Excel 8.0;")
For Each Tbl In DB.TableDefs
' Debug.Print Tbl.Name
'If (Tbl.Attributes And dbSystemObject) Then
If Right$(Tbl.Name, 1) = "$" Or Right$(Tbl.Name, 2) = "$'" Then
'名前ボックス等に表示される範囲名等を除く
'ワークシート名には自動的にシート名の後ろに $ が付くので
List1.AddItem Tbl.Name
nCount = nCount + 1 'シート数を取得する場合
End If
Next Tbl
List1.Visible = True
List1.Move 150, 270, 2445, 2040
DB.Close
Set DB = Nothing
MsgBox "合計 " & nCount & " 個のシートがありました。"
End Sub
ListViewの使い方は分かっていますか?
それが分かれば好きなようにできると思います。
そういう意味で
>ListItemsプロパティ、ColumnHeadersプロパティ、それに関するメソッド
>等を調べてみてはいかがでしょう?
と書いたつもりなんですが
調べながらやっているので
全部理解するというのは難しいです・・・
申し訳ありません。
なので聞いているのですが・・・
とりあえずListItemsプロパティ、ColumnHeadersプロパティ
は調べましたか?
それでどこが分かりませんでしたか?
やってみました。
Do Until RS.EOF
With RS
'A列・B列・C列のデータを取得
MyData = ""
MyData = MyData & .Fields(0) & vbTab & .Fields(1) & vbTab & .Fields(2) & vbCrLf
' リストボックスにはこれで表示できました
List1.List(i) = MyData
ListView1.ListItems(i).Text = .Fields(0)
ListView1.ListItems(i).SubItems(1) = .Fields(1)
i = i + 1
.MoveNext '次のレコードに移動
End With
Loop
そうすると
ListView1.ListItems(i).Text = .Fields(0)
の部分で
『インデックスが範囲を超えています。』という
実行時のエラーが起きます。
ListItemsのメンバを増やさずに代入しているからです。
リストビューの行を増やすには(ReportViewで)ListItems.Addを使用します。
リストビューの列を増やすにはColumnHeaders.Addを使用します
あとListItems、ColumnHeadersの開始番号は1からです
MSDNでListItemsコレクション、ColumnHeaders コレクションの
ヘルプを参照下さい。
'末尾レコードまでのデータを読込
Do Until RS.EOF
With RS
'A列・B列・C列のデータを取得
MyData = ""
MyData = MyData & .Fields(0) & vbTab & .Fields(1) & vbTab & .Fields(2) & vbCrLf
' ListBoxに表示
List1.List(i) = MyData
ListView1.ListItems.Add.Text = .Fields(0)
ListView1.ListItems.Add.SubItems(1) = .Fields(1)
ListView1.ListItems.Add.SubItems(2) = .Fields(2)
i = i + 1
.MoveNext '次のレコードに移動
End With
Loop
ListItem.Addをしてみたのですが、Excelの1行目がListViewの1行目に
表示されず、ずれて表示されてしまいます。
ExcelのA1にはA1、A2にはA2、A3にはA3が入っているとします。
そうするとA1はListViewの1行目の.Textに入るのですが、A2は2行目のSubItem(1)に入ってしまいます。
そうやって全部ずれていきます。
もしExcelのセルの中に一部入力がなかった場合の処理はLoopの中で
処理を行えばいいのですか?
あとListViewで列を増やすことはないので、ColumnHeaders.Addを使うことはありません。
わざわざありがとうございます。
'末尾レコードまでのデータを読込
Do Until RS.EOF
With RS
'A列・B列・C列のデータを取得
Set lItem = ListView1.ListItems.Add
lItem.Text = .Fields(0)
lItem.SubItems(1) = .Fields(1)
lItem.SubItems(2) = .Fields(2)
.MoveNext '次のレコードに移動
End With
Loop
これでちゃんとListViewに表示することができました。
ですが、これだとセルのA1からセットしていきます。
もしA5とかA6とか途中から読み込んでListViewの1行目にセットしていくには
どうしたらよいでしょうか?
…
……好きなだけ
.MoveNext '次のレコードに移動
すれば良いだけの気がしますが?
もしくは
.Move 5 '5行目に移動
とか?
.Move は .MoveLast や .MoveFirst しないと正常に
動かないことが…あるかも?…だいぶ前の知識なので
今、どうなってるか分かりませんが…。
Recordset のメソッドくらい一通り調べておいた方が
いいんじゃないですか?
やりたいことに近づいてきてはいるのですが
もうひとつ質問させていただきます。
もしExcelのセルが一部何も入っていない場合
実行エラーで『Nullの使い方が不正です』と出てしまいます。
With RS
If .Fields(0) = Null Then
lItem.Text = ""
Else
lItem.Text = .Fields(0)
End If
End With
としているのですがそれでも同じエラーが出てしまいます。
With RS
If .Fields(0) Is Null Then
lItem.Text = ""
Else
lItem.Text = .Fields(0)
End If
End With
もしくは
lItem.Text = RS.Fields(0) & ""
これだけでも大丈夫です。
どうもありがとうございました。
皆様感謝です。
やっと思い通りのものができるようになりました。
皆様のおかげです。
本当にありがとうございました。