通过【部件】-【可插入对象】-Excel工作表可以得到一个“Sheet”控件,估计是个OLE控件吧,在对话框中画出一个实体即可以得到一个默认的Sheet1,运行时双击它即进入Excel界面,可以像在Excel中操作它。我想在我的程序中把它作为一种显示手段,即要在我自己的程序中获取它的有效对象,如Excel.Application、Excel.WorkBook、Excel.Sheet等,从而指定它显示和操作我指定的Excel文件。可是它的属性和方法很有限,而且Sheet1.Object一直没有初始化。
求教该怎么做?-----------------------------------
为什么我要这样做:由于我的表中有一些格式如合并单元格、带公式的单元格等,在MSFlexGrid中没有正确显示,而且对于客户来说只要求能够看见该Excel文件的内容而已,所以我认为使用上面的设计应该最简单。到这里还有100分:
http://expert.csdn.net/Expert/topic/3045/3045998.xml?temp=.3426935

解决方案 »

  1.   

    Option Explicit
    Private Const GWL_STYLE = (-16)
    Private Const WS_DLGFRAME = &H400000
    Private Const WS_CHILD = &H40000000
    Private Const WS_CHILDWINDOW = (WS_CHILD)
    Private Const WS_VSCROLL = &H200000
    Private Const WS_CAPTION = &HC00000
    Private Const WS_BORDER = &H800000
    Private Const WS_THICKFRAME = &H40000
    Private Const WS_SIZEBOX = WS_THICKFRAMEPrivate Type RECT
           Left As Long
           Top As Long
           Right As Long
           Bottom As Long
    End TypePrivate Declare Function FindWindow Lib "user32" _
       Alias "FindWindowA" _
       (ByVal lpClassName As String, _
       ByVal lpWindowName As String) As Long
        
    Private Declare Function GetParent Lib "user32" _
       (ByVal hwnd As Long) As Long
        
    Private Declare Function SetParent Lib "user32" _
       (ByVal hWndChild As Long, _
       ByVal hWndNewParent As Long) As Long
        
    Private Declare Function SetForegroundWindow Lib "user32" _
       (ByVal hwnd As Long) As Long
        
    Private Declare Function GetWindowLong Lib "user32" _
       Alias "GetWindowLongA" _
       (ByVal hwnd As Long, _
       ByVal nIndex As Long) As Long
    Private Declare Function SetWindowLong Lib "user32" _
       Alias "SetWindowLongA" _
       (ByVal hwnd As Long, _
       ByVal nIndex As Long, _
       ByVal dwNewLong As Long) As Long
        
    Private Declare Function MoveWindow Lib "user32" _
       (ByVal hwnd As Long, _
       ByVal x As Long, _
       ByVal y As Long, _
       ByVal nWidth As Long, _
       ByVal nHeight As Long, _
       ByVal bRepaint As Long) As Long
        
    Private Declare Function SetWindowPos Lib "user32" _
       (ByVal hwnd As Long, _
       ByVal hWndInsertAfter As Long, _
       ByVal x As Long, ByVal y As Long, _
       ByVal cx As Long, _
       ByVal cy As Long, _
       ByVal wFlags As Long) As Long
        
    Private Declare Function FindWindowEx Lib "user32" _
       Alias "FindWindowExA" _
       (ByVal hWnd1 As Long, _
       ByVal hWnd2 As Long, _
       ByVal lpsz1 As String, _
       ByVal lpsz2 As String) As LongPrivate WithEvents mobjXL As Excel.Application
    Private mlngXLHwnd As Long
    Dim WithEvents Label1 As Label
    Dim WithEvents Picture1 As PictureBox
       
    Private Sub MDIform_Load()   
       Dim lngStyle As Long
       Dim c As Object
       Dim lngStatusBar As Long
       Dim xl As Excel.Worksheet
       
       Set Picture1 = MDIForm1.Controls.Add("VB.PictureBox", "Picture1")
       
       Picture1.Visible = True
       Picture1.Align = 1
       Picture1.Height = 2
       
       Set mobjXL = New Excel.Application
          mobjXL.Caption = "10001"
       mobjXL.Visible = True   For Each c In mobjXL.CommandBars
           c.Enabled = False
       Next
       
       mlngXLHwnd = FindWindow("XLMAIN", "10001")
       SetParent mlngXLHwnd, Me.hwnd
        
       lngStyle = GetWindowLong(mlngXLHwnd, GWL_STYLE)
        
       lngStyle = lngStyle Xor WS_CAPTION
       lngStyle = lngStyle Xor WS_SIZEBOX
        
       SetWindowLong mlngXLHwnd, GWL_STYLE, lngStyle
                
       MoveWindow mlngXLHwnd, 0, 0, _
           (Me.ScaleWidth / Screen.TwipsPerPixelX), _
           (Me.ScaleHeight / Screen.TwipsPerPixelY), 1
        
       mobjXL.Workbooks.Add    With mobjXL.Application
            .SheetsInNewWorkbook = 1
            .DisplayFormulaBar = False
            .DisplayStatusBar = False
        End With
        
    End SubPrivate Sub MDIform_QueryUnload(Cancel As Integer, UnloadMode As Integer)
      Dim c As Object
       
       SetParent mlngXLHwnd, 0
       DoEvents
       mobjXL.Visible = False
       For Each c In mobjXL.CommandBars
         c.Enabled = False
       Next
       
     mobjXL.Application.SheetsInNewWorkbook = 3
        With Application
            .DisplayFormulaBar = True
            .DisplayStatusBar = True
        End With
       mobjXL.ActiveWindow.DisplayHeadings = True
       mobjXL.Quit
        
       Set mobjXL = Nothing
    End Sub
    Private Sub MDIform_Resize()
       If Not Me.WindowState = vbMinimized Then
           MoveWindow mlngXLHwnd, 0, _
               (Picture1.Height / Screen.TwipsPerPixelY), _
               (Me.ScaleWidth / Screen.TwipsPerPixelX), _
               (Me.ScaleHeight / Screen.TwipsPerPixelY), 1
       End If
    End SubPrivate Sub mobjXL_WindowResize(ByVal Wb As Excel.Workbook, ByVal Wn As Excel.Window)
       MoveWindow mlngXLHwnd, 0, 0, _
           (Me.ScaleWidth / Screen.TwipsPerPixelX), _
           (Me.ScaleHeight / Screen.TwipsPerPixelY), 1
    End Sub
      

  2.   

    谢谢 vansoft(Vansoft Workroom) ,这个方法确实可用。不过我还是想知道那个“可插入对象”怎么用,暂时就不结贴,最迟本周六一定结贴。如果你愿意的话还可以到上面那个地址去拿分。
      

  3.   

    可插入对象就是把EXCEL作为对象来用,
    你不能编程的,
    要编程,用以下方法,
    引用EXCEL库,
    定义EXCEL对象,
    dim objExcel as new excel.application
    这时就可以用objExcel点、点属性出来了