程式中点击按钮打开导入Excel文件的窗口,用的是CommonDialog控件。相关代码如下:    CommonDialog1.DialogTitle = "选取要汇入之 Excel 档案"
    CommonDialog1.DefaultExt = "xls"
    CommonDialog1.Filter = "Excel档案 (*.xls)|*.xls"
    On Error GoTo subImport_Cancel
    CommonDialog1.ShowOpen                 '打开Excel选取窗口
    'On Error GoTo subImport_Err
现在问题是,如果我打开了该CommonDialog窗口后,再单击任务栏其他程式,会导致该CommonDialog窗口消失。也就是失去焦点后它会消失,造成之前开的其他窗口也被锁定。程式无响应。

解决方案 »

  1.   

    还有这回事?commondialog应该就是一个模式窗口吧,怎么会消失呢
      

  2.   

    是的,当打开CommonDialog窗口时,直接单击这个窗口背后的是不可以的,但可以在任务栏单击其他程式的窗口。这时该CommonDialog窗口就消失了,难道这是VB中的一个Bug?
      

  3.   

    与VB无关,是你的要求奇怪,你在IE里另存也这样,写IE的人应该够牛吧?
      

  4.   

    我打开的这个VB程式,总共要打开3个窗口,那个CommonDialog是最后开起来的(因为它是模式窗口,此时其他窗口被锁定不能操作了),如果消失了,再还原窗口时,其他窗口还在,唯有那个CommonDialog消失。其他窗口还在锁定状态,整个程式相当于卡死掉了。只能进任务管理器强制结束。
      

  5.   

    跟IE另存不一样,我试了IE另存后,如果单击任务栏其他窗口,它会隐藏到背后,再单击可以还原。我那个就直接消失了。
      

  6.   

    我估计是On Error GoTo subImport_Cancel
    害的
    程序没编完就别处理错误
    否则你永远不知道错误在哪里
    那还编啥编?
      

  7.   

    VB 有打了sp6补丁,xp sp3操作系统。
      

  8.   

    我程式其他地方也有打开CommonDialog,只不过是showSave,而不是showOpen,也不跑。应该是程式哪个地方有问题。
      

  9.   

    这个我都去掉了,测试还是一样。现在我把整个方法的代码都贴出来。求高手解决。Private Sub cmdImport_Click() '汇入Excel档案
        Dim sTableName As String
        Dim dbDataBase As Database
        Dim rsRecordset As Recordset
        Dim rsRecordset1 As Recordset
        
        Dim lngRow As Long
        Dim lngCol As Long
        Dim sql As String
        Dim lngCodeNotFind As Long
        Dim lngVendorNotFind As Long
        Dim strMsg As String
        Dim intMemoNum As Integer
        Dim SalChkDep As String
        Dim chkField As String
        chkField = ""
        
        chkPer = True    cmdImport.Enabled = False
        Command1.Enabled = False
        Command2.Enabled = False
        cmdclean.Enabled = False
        Conn.Enabled = False
        ' 汇入档案
        CommonDialog1.DialogTitle = "选取要汇入之 Excel 档案"
        CommonDialog1.DefaultExt = "xls"
        CommonDialog1.Filter = "Excel档案 (*.xls)|*.xls"
        On Error GoTo subImport_Cancel
        CommonDialog1.ShowOpen                  '打开Excel选取窗口
        'On Error GoTo subImport_Err    strImportFileName = CommonDialog1.FileName
        txtFilePathName.Text = CommonDialog1.FileTitle
        FileName = CommonDialog1.FileName
        
        '检查是有传回汇入之档案名称
        If strImportFileName = "" Then   '检查该文档是否存在
            MsgBox "请选择Excel汇入资料.."
            Exit Sub
        End If
        
        intStrNum = InStr(txtFilePathName.Text, ".") '第一次出现点的位置
        TableName = Mid(txtFilePathName.Text, 1, intStrNum - 1) '截取点之前字符串
        
        txtFilePathName.Text = FileName
        
        DoEvents
        ' 汇入档案至ACCESS档案
        Screen.MousePointer = vbHourglass
        If Not funXls2Mdb(strImportFileName, intOpt) Then
            MsgBox "汇入档案不成功!", vbCritical, "汇入档案"
            Exit Sub
        End If    
        ' 将ACCESS资料汇入至Spread
        '1.决定Spread的header
        SpreadHeaderShow intOpt
        
        '2.将资料show再Spread
        Set dbDataBase = OpenDatabase(sAccessFile)
        sTableName = "select * from MgtLSalMidTb" + CStr(intOpt)
        Set rsRecordset = dbDataBase.OpenRecordset(sTableName)
        
      '此处省略一段验证资料正确性代码
        
        '除了说明其他不可edit
        For I = 1 To spdView.MaxCols
            spdView.Row = -1
            spdView.Col = I        If (intOpt <> 2 And intOpt <> 3) And I = spdView.MaxCols Then
                spdView.Lock = False
            Else
                spdView.Lock = True
            End If
        Next I
        
        
       '******汇入资料数目的统计  Modified by Len 2010/11/01
       ' Dim TotInt As Long
        Dim TotInt As Double '2010/10/10
        If intOpt = 1 Then
            Label5.Caption = "此次共汇入 " & rsRecordset.RecordCount & " 笔有效资料!"
        ElseIf intOpt = 2 Then
            Set dbDataBase = OpenDatabase(sAccessFile)
            sTableName = "select * from MgtLSalMidTb" + CStr(intOpt)
            Set rsRecordset1 = dbDataBase.OpenRecordset(sTableName)
            If Not rsRecordset1.EOF Then
                Do While Not rsRecordset1.EOF
                    TotInt = TotInt + rsRecordset1(2)
                    rsRecordset1.MoveNext
                Loop
            End If
            Screen.MousePointer = vbDefault
            'Label5.Caption = "此次共汇入 " & rsRecordset.RecordCount & " 笔有效资料!合计为" & TotInt & "元"
            Label5.Caption = "此次共汇入 " & rsRecordset.RecordCount & " 笔有效资料!"
        '********下面的3、5、6暂时未用到
    '    ElseIf intOpt = 3 Then
    '        Set dbDataBase = OpenDatabase(sAccessFile)
    '        sTableName = "select * from MgtLSalMidTb" + CStr(intOpt)
    '        Set rsRecordset1 = dbDataBase.OpenRecordset(sTableName)
    '        If Not rsRecordset1.EOF Then
    '            Do While Not rsRecordset1.EOF
    '                TotInt = TotInt + rsRecordset1(2)
    '                rsRecordset1.MoveNext
    '            Loop
    '        End If
    '        Set rsRecordset1 = dbDataBase.OpenRecordset(sTableName)
    '        Screen.MousePointer = vbDefault
    '        Label5.Caption = "此次共汇入 " & rsRecordset.RecordCount & " 笔有效资料!合计为" & TotInt & "元"
        ElseIf intOpt = 4 Then '成本中心资料数目统计
            Set dbDataBase = OpenDatabase(sAccessFile)
            sTableName = "select * from MgtLSalMidTb" + CStr(intOpt)
            Set rsRecordset1 = dbDataBase.OpenRecordset(sTableName)
            If Not rsRecordset1.EOF Then
                Do While Not rsRecordset1.EOF
                    TotInt = TotInt + rsRecordset1(2)
                    rsRecordset1.MoveNext
                Loop
            End If
            Set rsRecordset1 = dbDataBase.OpenRecordset(sTableName)
            Screen.MousePointer = vbDefault
            Label5.Caption = "此次共汇入 " & rsRecordset.RecordCount & " 笔有效资料!"
    '    ElseIf intOpt = 5 Then
    '        Set dbDataBase = OpenDatabase(sAccessFile)
    '        sTableName = "select * from MgtLSalMidTb" + CStr(intOpt)
    '        Set rsRecordset1 = dbDataBase.OpenRecordset(sTableName)
    '        If Not rsRecordset1.EOF Then
    '            Do While Not rsRecordset1.EOF
    '                TotInt = TotInt + rsRecordset1(1)
    '                rsRecordset1.MoveNext
    '            Loop
    '        End If
    '        Set rsRecordset1 = dbDataBase.OpenRecordset(sTableName)
    '        Screen.MousePointer = vbDefault
    '        Label5.Caption = "此次共汇入 " & rsRecordset.RecordCount & " 笔有效资料!合计为" & TotInt & "天"
    '    ElseIf intOpt = 6 Then
    '        Label5.Caption = "此次共汇入 " & rsRecordset.RecordCount & " 笔有效资料!"
        End If
    '****************************************************************************    Set rsRecordset1 = Nothing
        Set rsRecordset = Nothing
        Set dbDataBase = Nothing
        
        Command2.Enabled = True
        cmdclean.Enabled = True
        Conn.Enabled = True    Command1.Enabled = True
        cmdImport.Enabled = True
        SSFrame3.Visible = TruesubImport_Cancel:    Command2.Enabled = True
        cmdclean.Enabled = True
        Conn.Enabled = True    Command1.Enabled = True
        cmdImport.Enabled = True
    '    SSFrame3.Visible = True    Screen.MousePointer = vbDefault
        Set rsRecordset = Nothing
        Set dbDataBase = Nothing
        Set rstINVBASIC = Nothing
        Set SnpItem = Nothing
        
        Exit Sub
    subImport_Err:
        Set rsRecordset = Nothing
        Set dbDataBase = Nothing
        Set rstINVBASIC = Nothing
        Screen.MousePointer = vbDefault
        MsgBox "错误代码:" & Err.Number & vbCrLf & "错误说明:" & Err.Description, 16, "执行中断"
        Command2.Enabled = True
        cmdclean.Enabled = True
        Conn.Enabled = True    Command1.Enabled = True
        cmdImport.Enabled = True
    End Sub
      

  10.   

    打开对话框是模式窗口,单击任务栏后,对话框会跑到所有窗口背后,你当然就不能选择文件了。
    解决的办法是:将对话框控件所在的父窗口用setwindowspos置为顶级窗口,这样弹出的对话框在父窗口前面,当然就在所有窗口前面。
      

  11.   

    VB是有这种Bug,比如你打开窗口A,再打开窗口B。在窗口B上打开一个CommonDialog对话框,此时它是模态的。如果点击任务栏其他程式,CommonDialog对话框就会隐藏,但并没有消失。
    此时按住键盘上的Alt+Tab键即可调出来。
    不调出来,会误以为程式死掉了,点其他窗口没反应。