【问题标题】:Improper use of a Property不当使用财产
【发布时间】:2019-08-14 20:10:02
【问题描述】:

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

在文件的第一张纸上,我创建了一个按钮,然后将其打开并放入代码。但是,当我运行代码时,我收到一个错误提示

对属性的不当使用

并且 .Worksheets 被标记。 或者问题可能与Private Sub CommandButton1_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

【问题讨论】:

  • ActiveWorkbook.Worksheets ("Sheet1") 应该是With ActiveWorkbook.Worksheets("Sheet1")
  • 另外,使用正确的引号。不应该使用“”,而是使用""
  • 我编辑了代码并使用了正确的引用。现在我得到“有效范围之外的索引”
  • 当前活动的工作簿中是否存在名为“Sheet1”的工作表?我强烈建议您不要参考活动工作簿。相反,声明一个工作簿或工作表变量,并最好使用工作表代号进行设置,如果不可能,请使用工作表的名称或索引。
  • 欢迎来到 SO。您正在添加带有行 Set report = Workbooks.Add 的新工作簿,以便新工作簿在工作表中具有默认名称。这些默认名称取决于您的语言设置。此外,当创建一个新工作簿时,它会变成活动的一个,所以实际上当您稍后执行ActiveWorkbook.Worksheets("Sheet1") 时,您正在使用新工作簿,它是一个新工作簿,所以它完全是空白的。这可能会导致失败如果您尝试在执行此代码的工作簿中激活工作表,请使用 ThisWorkbook 而不是 ActiveWorkbook

标签: excel vba


【解决方案1】:

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

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

【讨论】:

  • 这似乎不错。它在技术上不是这个问题的一部分,但这是我现在得到的错误 Object required error at "colval1 = ws1.Cells(row, col).Formula"。
  • 我没有看到任何设置 ws1ws2 变量的代码。您指的是空变量。你可以看到我在引用它之前是如何设置我的ws 变量的
  • 我所知道的是 colval1 应该在 wk1(worksheet1) 中获取该行的值,然后我们比较两个工作表中的该行 If colval1 colval2 。如果它们不同,请更改字体和其他内容
  • 查看我的代码以及我如何声明和设置工作表变量。此变量是对您设置的特定工作表的引用。您应该尝试将工作表变量与 ws1ws2 一起使用,但您从未设置这些变量(将它们链接到工作表)
  • 让我补充一点,使用Option Explicit 将是一个很好的起点。这迫使您声明每个变量,从而确保您不会犯任何拼写错误或空引用。编译器会在代码执行前立即意识到ws1ws2是无意义的变量
【解决方案2】:

改变这个:

ActiveWorkbook.Worksheets ("Sheet1")

到这里:

With ActiveWorkbook.Worksheets("Sheet1")

Sheet2 相同

【讨论】:

  • 感谢您的回答。现在我在“With ActiveWorkbook.Worksheets("Sheet1")”处收到一个错误,说索引超出了有效范围
  • 是否有名为“Sheet1”的工作表?还是叫“Sheet 1”(带空格)?
  • 我在上面发表了评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
相关资源
最近更新 更多