这是我的代码,请大家帮我看一下,怎么样才能在VB窗体里编辑Excel(就象在Excel环境下编辑Excel文档一样)
说明:1、在运行代码之前先在VB窗体里加一个Picture控件 并将Align属性设成1-Align Top
2、加入如下代码后, 按F5运行
在窗体里加如下代码:
Dim mobjxl As Excel.Application
Dim mobjxlBook As Excel.Workbook
Dim mobjxlSheet As Excel.Worksheet
Dim mobjxlQuery As Excel.QueryTablePrivate mlngXLHwnd As Long
Dim blnShow As Boolean
Dim lngStyle As LongPrivate Sub Form_Load()
   Dim lngStyle As Long
   Dim c As Object
   Dim lngStatusBar As Long   Set mobjxl = New Excel.Application
   mobjxl.Caption = "我的Excel"   For Each c In mobjxl.CommandBars
       c.Enabled = True
   Next   mlngXLHwnd = FindWindow("XLMAIN", vbNullString)
   SetParent mlngXLHwnd, Me.hWnd   lngStyle = GetWindowLong(mlngXLHwnd, GWL_STYLE)
   lngStyle = lngStyle Xor WS_CAPTION
   lngStyle = lngStyle Xor WS_SIZEBOX   SetWindowLong mlngXLHwnd, GWL_STYLE, lngStyle   If Not Me.WindowState = vbMinimized Then
       MoveWindow mlngXLHwnd, (Picture1.Width / Screen.TwipsPerPixelX + 4), _
           0, _
           (Me.ScaleWidth / Screen.TwipsPerPixelX), _
           (Me.ScaleHeight / Screen.TwipsPerPixelY), -1
   End If
   MoveWindow mlngXLHwnd, 0, 0, _
       (Me.ScaleWidth / Screen.TwipsPerPixelX), _
       (Me.ScaleHeight / Screen.TwipsPerPixelY), 1
       
       
    Set mobjxlBook = mobjxl.Workbooks().Add
    Set mobjxlSheet = mobjxlBook.Worksheets("sheet1")
    mobjxl.Application.Visible = True
       End SubPrivate Sub form_QueryUnload(Cancel As Integer, UnloadMode As Integer)   On Error Resume Next
   Dim c As Object  
   
   mobjxl.Visible = False
   mobjxl.DisplayAlerts = False         '不显示是否保存对话框
   For Each c In mobjxl.CommandBars
       c.Enabled = True
   Next
'   隐藏行号和列号
   mobjxl.ActiveWindow.DisplayHeadings = True
'   隐藏表单标签
   mobjxl.ActiveWindow.DisplayWorkbookTabs = False
'   显示状态栏
   mobjxl.Application.DisplayStatusBar = True
'   要将Excel设置成最大化
   mobjxl.WindowState = xlMaximized
   mobjxl.Quit   Set mobjxlQuery = Nothing
   Set mobjxlSheet = Nothing
   Set mobjxlBook = Nothing
   Set mobjxl = Nothing
   
    DoEvents
    '取消Excel作为当前窗体的子窗体
    SetParent mlngXLHwnd, 0
End SubPrivate Sub form_Resize()
   If Not Me.WindowState = vbMinimized Then
       MoveWindow mlngXLHwnd, 0, _
          (Picture1.Height / Screen.TwipsPerPixelY), _
           (Me.ScaleWidth / Screen.TwipsPerPixelX), _
           (Me.ScaleHeight / Screen.TwipsPerPixelY - 15), -1
   End IfEnd SubPrivate Sub mobjXL_WindowResize(ByVal Wb As Excel.Workbook, ByVal Wn As Excel.Window)
   MoveWindow mlngXLHwnd, (Picture1.Width / Screen.TwipsPerPixelX), 0, _
       (Me.ScaleWidth / Screen.TwipsPerPixelX), _
       (Me.ScaleHeight / Screen.TwipsPerPixelY - 1000), 1End Sub在模块里加如下代码:
Option ExplicitPublic Const GWL_STYLE = (-16)
Public Const WS_DLGFRAME = &H400000
Public Const WS_CHILD = &H40000000
Public Const WS_CHILDWINDOW = (WS_CHILD)
Public Const WS_VSCROLL = &H200000
Public Const WS_CAPTION = &HC00000
Public Const WS_BORDER = &H800000
Public Const WS_THICKFRAME = &H40000
Public Const WS_SIZEBOX = WS_THICKFRAME
Public Const msoGradientHorizontal = 1Public Const chrWidth = 340
Public Const chrHeight = 270Public Type RECT
       Left As Long
       Top As Long
       Right As Long
       Bottom As Long
End TypePublic Declare Function FindWindow Lib "user32" _
   Alias "FindWindowA" _
   (ByVal lpClassName As String, _
   ByVal lpWindowName As String) As Long
    
Public Declare Function GetParent Lib "user32" _
   (ByVal hWnd As Long) As Long
    
Public Declare Function SetParent Lib "user32" _
   (ByVal hWndChild As Long, _
   ByVal hWndNewParent As Long) As Long
    
Public Declare Function SetForegroundWindow Lib "user32" _
   (ByVal hWnd As Long) As Long
    
Public Declare Function GetWindowLong Lib "user32" _
   Alias "GetWindowLongA" _
   (ByVal hWnd As Long, _
   ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" _
   Alias "SetWindowLongA" _
   (ByVal hWnd As Long, _
   ByVal nIndex As Long, _
   ByVal dwNewLong As Long) As Long
    
Public 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
    
Public 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
    
Public Declare Function FindWindowEx Lib "user32" _
   Alias "FindWindowExA" _
   (ByVal hWnd1 As Long, _
   ByVal hWnd2 As Long, _
   ByVal lpsz1 As String, _
   ByVal lpsz2 As String) As Long

解决方案 »

  1.   

    spredsheet控件可以编辑
    但是不知道是不是能够满足你的要求
      

  2.   

    我不明白   lngStyle = GetWindowLong(mlngXLHwnd, GWL_STYLE)
       lngStyle = lngStyle Xor WS_CAPTION
       lngStyle = lngStyle Xor WS_SIZEBOXxor在这里起什么作用?
      

  3.   

    你改成这样就可以了--------------------------------------------Private Sub Form_Load()
       Dim lngStyle As Long
       Dim c As Object
       Dim lngStatusBar As Long   Set mobjXL = New Excel.Application
       mobjXL.Caption = "我的Excel"   If Not Me.WindowState = vbMinimized Then
           MoveWindow mlngXLHwnd, (Picture1.Width / Screen.TwipsPerPixelX + 4), _
               0, _
               (Me.ScaleWidth / Screen.TwipsPerPixelX), _
               (Me.ScaleHeight / Screen.TwipsPerPixelY), -1
       End If
       MoveWindow mlngXLHwnd, 0, 0, _
           (Me.ScaleWidth / Screen.TwipsPerPixelX), _
           (Me.ScaleHeight / Screen.TwipsPerPixelY), 1
                  
        Set mobjxlBook = mobjXL.Workbooks().Add
        Set mobjxlSheet = mobjxlBook.Worksheets("sheet1")
        mobjXL.Application.Visible = True
        
        mlngXLHwnd = FindWindow("XLMAIN", vbNullString)
        SetParent mlngXLHwnd, Me.hWnd
        
       lngStyle = GetWindowLong(mlngXLHwnd, GWL_STYLE)
       lngStyle = lngStyle Xor WS_CAPTION
       lngStyle = lngStyle Xor WS_SIZEBOX   SetWindowLong mlngXLHwnd, GWL_STYLE, lngStyle
        
       For Each c In mobjXL.CommandBars
           c.Enabled = True
       Next
        
    End Sub