1

我刚写的一些代码有问题。基本上,此代码位于由主窗体打开的对话框样式窗体内。

此代码有两个子项:
第一个是OnLoad谨慎打开 Excel 工作簿以构建其工作表列表的方法。
第二个 sub 是该OnClick()对话框上一个按钮的方法,它返回两个值并进行一些错误检查。

由于某种原因,该Sheets()方法有时会失败,并且在失败后立即执行完全相同的步骤实际上可能有效。我已经使用“局部变量”窗口以及间谍工具来观察这些值是否真的有意义并且它们确实有意义。
关于为什么会发生这种情况的任何提示?

此外,如果该数据库掌握在有经验的用户手中,这也没什么大不了的,但在这种情况下,我们不能假设用户完全了解 Access(甚至不关闭和重新打开表单)。

Option Compare Database
Option Explicit

Dim xlApp As Excel.Application
Dim xlWb As Excel.Workbook

Private Sub Form_Open(Cancel As Integer)
    Dim xl_sub_ws As Excel.Worksheet
    Set xlApp = New Excel.Application
    With xlApp
        .Visible = False
        Set xlWb = .Workbooks.Open(Forms("MenuGeneral")("CheminFichierImport").Value)
    End With

    For Each xl_sub_ws In xlWb.Worksheets
        lst_sheets.AddItem (xl_sub_ws.Name)
    Next xl_sub_ws
End Sub

Private Sub renvoyer_valeur_Click()
    Dim ret As VbMsgBoxResult

    If lst_sheets.Value <> "" Then
        Forms("MenuGeneral")("worksheet_name").Value = lst_sheets.Value
        Forms("MenuGeneral")("nb_colonnes").Value = Sheets(lst_sheets.Value).UsedRange.Columns.Count

        If Forms("MenuGeneral")("nb_colonnes") < 4 Then
            ret = MsgBox("La feuille à importer contient moins de 4 champs de la clé comptable." & _
                    "Souhaitez-vous procéder ainsi (oui) ou choisir une autre feuille (non) ?", vbYesNo)
            If ret = vbNo Then
                Forms("MenuGeneral")("nb_colonnes").Value = ""
                Exit Sub
            End If
        End If

        xlWb.Close
        xlApp.Quit
        DoCmd.Close acForm, "dlg_modal_feuille", acSaveNo
    Else
        MsgBox "S'il-vous-plaît choisir la feuille source"
    End If
End Sub

提前谢谢了。

4

1 回答 1

3

我会建议Worksheets而不是Sheets.

Worksheets是存在于工作簿中的集合。Worksheets使用工作簿的对象变量 ( xlWb?) 进行限定。

Forms("MenuGeneral")("nb_colonnes").Value = _
    xlWb.Worksheets(lst_sheets.Value).UsedRange.Columns.Count
于 2012-08-06T16:11:42.807 回答