Excel 不当使用财产

Excel 不当使用财产,excel,vba,Excel,Vba,代码应该比较两个excel文件,然后创建一个显示差异的新excel文件 在文件的第一页上,我创建了一个按钮,然后打开它并将代码放入。然而,当我运行代码时,我得到一个错误 不当使用财产 和。工作表已标记。 或者问题可能与Private Sub-CommandButton1\u Click() 我在网上做了一些研究,但没有成功,所以我希望能得到一些帮助 选项显式 Sub Compare2WorkSheets(ws1 As Worksheet, ws2 As Worksheet) Dim ws1row

代码应该比较两个excel文件,然后创建一个显示差异的新excel文件

在文件的第一页上,我创建了一个按钮,然后打开它并将代码放入。然而,当我运行代码时,我得到一个错误

不当使用财产

和。工作表已标记。 或者问题可能与
Private Sub-CommandButton1\u Click()

我在网上做了一些研究,但没有成功,所以我希望能得到一些帮助

选项显式

Sub Compare2WorkSheets(ws1 As Worksheet, ws2 As Worksheet)
Dim ws1row As Long, ws2row As Long, ws1col As Integer, ws2col As Integer
Dim maxrow As Long, maxcol As Integer, colval1 As String, colval2 As String
Dim report As Workbook 
Dim ws1 As Worksheet, ws2 As Worksheet
Dim difference As Long
Dim row As Long, col As Integer
Set report = Workbooks.Add

Set ws1 = ThisWorkbook.Worksheets(1)
Set ws2 = ThisWorkbook.Worksheets(1)

With ThisWorkbook.Worksheets("Sheet1")
    ws1row = .Rows.Count
    ws1col = .Columns.Count
End With
With ThisWorkbook.Worksheets("Sheet2")
    ws2row = .Rows.Count
    ws2col = .Columns.Count
End With

maxrow = ws1row
maxcol = ws1col

If maxrow < ws2row Then maxrow = ws2row
If maxcol < ws2col Then maxcol = ws2col

difference = 0

For col = 1 To maxcol
    For row = 1 To maxrow
    colval1 = ""
    colval2 = ""
    colval1 = ws1.Cells(row, col).Formula
    colval2 = ws2.Cells(row, col).Formula

    If colval1 <> colval2 Then
    difference = difference + 1
    Cells(row, col).Formula = colval1 & "<> " & colval2
    Cells(row, col).Interior.Color = 255
    Cells(row, col).Font.ColorIndex = 2
    Cells(row, col).Font.Bold = True
    End If
Next row
Next col

Columns("A:B").ColumnWidth = 25
report.Saved = True

If difference = 0 Then
report.Close False
End If
Set report = Nothing

MsgBox difference & " cells contain different data! ", vbInformation, "Comparing Two Worksheets"

End Sub
子比较2工作表(ws1作为工作表,ws2作为工作表)
将ws1row设置为Long,ws2row设置为Long,ws1col设置为Integer,ws2col设置为Integer
Dim maxrow为长,maxcol为整数,colval1为字符串,colval2为字符串
作为工作簿的Dim报告
将ws1标注为工作表,将ws2标注为工作表
细微的差别如同长
将行设置为长,列设置为整数
设置报告=工作簿。添加
设置ws1=This工作簿。工作表(1)
设置ws2=ThisWorkbook.Worksheets(1)
使用此工作簿。工作表(“表1”)
ws1row=.Rows.Count
ws1col=.Columns.Count
以
使用此工作簿。工作表(“表2”)
ws2row=.Rows.Count
ws2col=.Columns.Count
以
maxrow=ws1row
maxcol=ws1col
如果maxrow
更改此选项:

ActiveWorkbook.Worksheets ("Sheet1")
为此:

With ActiveWorkbook.Worksheets("Sheet1")

与Sheet2相同

根据我的评论,我将使用一个变量来引用特定工作簿的工作表:

Option Explicit

Private Sub CommandButton1_Click()

 Dim ws1row As Long, ws2row As Long, ws1col As Integer, ws2col As Integer
 Dim maxrow As Long, maxcol As Integer, colval1 As String, colval2 As String
 Dim report As Workbook, ws As Worksheet 'Declare ws to be a Worksheet variable
 Dim difference As Long, row As Long, col As Integer

 Set report = Workbooks.Add

 'Set the ws variable to be the first worksheet in the newly opened workbook
 Set ws = report.Worksheets(1)

 'You can then use the ws variable to refer to that specific worksheet
 'The variable is not affected by the sheet changing name or position
 'Example:
 ws.Name = "NewSheetName"
 MsgBox "The sheet at position " & ws.Index & " has changed names and is now called " & ws.Name

 'Rest of the code

ActiveWorkbook.Worksheets(“Sheet1”)
应与ActiveWorkbook.Worksheets(“Sheet1”)
一起使用<代码>“不应使用,请使用
代替标题我编辑了代码并使用了正确的引号。现在我得到“索引超出有效范围”当前活动的工作簿中是否存在名为“Sheet1”的工作表?我强烈建议您不要参考活动工作簿。相反,请声明工作簿或工作表变量,最好使用工作表代码名进行设置,如果不可能,请使用工作表的名称或索引。欢迎使用。您正在添加一个新工作簿,其中的行
Set report=Workbooks。添加
,以便新工作簿在工作表中具有默认名称。这些默认名称取决于您的语言设置。另外,在创建新工作簿时,它将变为活动工作簿,因此实际上,当您稍后执行
ActiveWorkbook.Worksheets(“Sheet1”)
时,您正在使用新工作簿,这是一个新工作簿,因此它完全为空。这可能会导致失败如果您试图激活工作簿中正在执行此代码的工作表,请使用
thishworkbook
而不是
ActiveWorkbook
谢谢您的回答。现在我在“With ActiveWorkbook.Worksheets(“Sheet1”)中遇到一个错误,说索引超出了有效范围是否有一个名为“Sheet1”的工作表?或者它被称为“表1”(带空格)?我在上面给出了一个评论。这似乎很好。从技术上讲,这不是这个问题的一部分,但这是我现在在“colval1=ws1.Cells(row,col).Formula”处得到的对象所需错误。我没有看到任何代码设置
ws1
ws2
变量。您指的是空变量。您可以看到,在引用它之前,我是如何设置我的
ws
变量的。我只知道colval1应该在wk1(工作表1)中获取该行的值,然后我们比较两个工作表中的该行,如果colval1 colval2。如果它们不同,请更改字体和其他内容查看我的代码以及如何声明和设置工作表变量。此变量是对您将其设置为的特定工作表的引用。假设您试图将工作表变量与
ws1
ws2
一起使用,但您从未设置这些变量(将它们链接到工作表)。让我补充一点,使用
选项Explicit
将是一个很好的起点。这迫使您声明每个变量,从而确保您不会犯任何拼写错误或空引用。在代码执行之前,编译器将立即意识到
ws1
ws2
是无意义变量