起動時にExcelから読込み

解決


きのこ  2004-08-02 14:54:44  No: 115265  IP: [192.*.*.*]

環境:Win2000 VB6.0

さっそく質問させていただきます。

実行時にExcelファイルを読込んでListViewに表示をさせたいのですが
どうやったらいいの教えてください。

編集 削除
きのこ  2004-08-02 15:00:38  No: 115266  IP: [192.*.*.*]

これではいけないと思い
もう一度書きます。

Excelファイルのオープン→ListViewにセット→Excelファイルの解放
このような手順でよろしいのですか?

Excelファイルのオープンと解放はなんとか調べて
思い通りになりそうです。
ですが、ListViewにセットするところがどうしても
わかりませんので教えていただけないでしょうか?

編集 削除
Max  2004-08-02 22:48:35  No: 115267  IP: [192.*.*.*]

ListItemsプロパティ、ColumnHeadersプロパティ、それに関するメソッド
等を調べてみてはいかがでしょう?

編集 削除
きのこ  2004-08-03 10:12:46  No: 115268  IP: [192.*.*.*]

レスありがとうございます。

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

編集 削除
Max  2004-08-03 11:09:00  No: 115269  IP: [192.*.*.*]

ListViewの使い方は分かっていますか?
それが分かれば好きなようにできると思います。
そういう意味で
>ListItemsプロパティ、ColumnHeadersプロパティ、それに関するメソッド
>等を調べてみてはいかがでしょう?
と書いたつもりなんですが

編集 削除
きのこ  2004-08-03 11:22:57  No: 115270  IP: [192.*.*.*]

調べながらやっているので
全部理解するというのは難しいです・・・
申し訳ありません。

なので聞いているのですが・・・

編集 削除
Max  2004-08-03 11:56:07  No: 115271  IP: [192.*.*.*]

とりあえずListItemsプロパティ、ColumnHeadersプロパティ
は調べましたか?
それでどこが分かりませんでしたか?

編集 削除
きのこ  2004-08-04 11:21:00  No: 115272  IP: [192.*.*.*]

やってみました。

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)
の部分で
『インデックスが範囲を超えています。』という
実行時のエラーが起きます。

編集 削除
Max  2004-08-04 17:47:46  No: 115273  IP: [192.*.*.*]

ListItemsのメンバを増やさずに代入しているからです。
リストビューの行を増やすには(ReportViewで)ListItems.Addを使用します。
リストビューの列を増やすにはColumnHeaders.Addを使用します
あとListItems、ColumnHeadersの開始番号は1からです

MSDNでListItemsコレクション、ColumnHeaders コレクションの
ヘルプを参照下さい。

編集 削除
きのこ  2004-08-05 10:27:52  No: 115274  IP: [192.*.*.*]

'末尾レコードまでのデータを読込
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を使うことはありません。
わざわざありがとうございます。

編集 削除
きのこ  2004-08-05 11:43:13  No: 115275  IP: [192.*.*.*]

'末尾レコードまでのデータを読込
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行目にセットしていくには
どうしたらよいでしょうか?

編集 削除
特攻隊長まるるう  2004-08-05 12:13:33  No: 115276  IP: [192.*.*.*]


……好きなだけ
        .MoveNext         '次のレコードに移動
すれば良いだけの気がしますが?
もしくは
        .Move 5  '5行目に移動
とか?
.Move は .MoveLast や .MoveFirst しないと正常に
動かないことが…あるかも?…だいぶ前の知識なので
今、どうなってるか分かりませんが…。

Recordset のメソッドくらい一通り調べておいた方が
いいんじゃないですか?

編集 削除
きのこ  2004-08-05 14:28:27  No: 115277  IP: [192.*.*.*]

やりたいことに近づいてきてはいるのですが
もうひとつ質問させていただきます。

もしExcelのセルが一部何も入っていない場合
実行エラーで『Nullの使い方が不正です』と出てしまいます。

With RS
    If .Fields(0) = Null Then
        lItem.Text = ""
    Else
        lItem.Text = .Fields(0)
    End If
End With

としているのですがそれでも同じエラーが出てしまいます。

編集 削除
nanashi  2004-08-05 14:47:47  No: 115278  IP: [192.*.*.*]

With RS
    If .Fields(0) Is Null Then
        lItem.Text = ""
    Else
        lItem.Text = .Fields(0)
    End If
End With

もしくは

lItem.Text = RS.Fields(0) & ""

これだけでも大丈夫です。

編集 削除
きのこ  2004-08-05 15:24:52  No: 115279  IP: [192.*.*.*]

どうもありがとうございました。
皆様感謝です。
やっと思い通りのものができるようになりました。
皆様のおかげです。
本当にありがとうございました。

編集 削除