Excel 比较不同工作表中的两个文本单元格

Excel 比较不同工作表中的两个文本单元格,excel,vba,loops,compare,Excel,Vba,Loops,Compare,我试图比较不同工作表中的两个文本单元格(如abcDEF)。一张是固定的,但另一张不是 我的代码是: Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long, LastRow As Long, n As Long Dim Project As String Dim Responsible As String, Site As String, Sample As String, _ Description As S

我试图比较不同工作表中的两个文本单元格(如
abcDEF
)。一张是固定的,但另一张不是

我的代码是:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim i As Long, LastRow As Long, n As Long
Dim Project As String
Dim Responsible As String, Site As String, Sample As String, _
    Description As String, Parameter As String, Method As String
Dim j As Long

Application.EnableEvents = False

' Find LastRow in Col A into the Sheet2
LastRow = Sheet2.Range("A" & Rows.Count).End(xlUp).Row

' Select all Col A in Project
For Each Value In Sheet2.Range("A2:A" & LastRow)
   Project = Project & "," & Value
Next Value

Sheet1.Range("A2").ClearContents: Sheet1.Range("A2").Validation.Delete

' Create the Data Validation List
With Range("A2").Validation
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween,     Formula1:=Project
    .IgnoreBlank = True
    .InCellDropdown = True
    .InputTitle = ""
    .ErrorTitle = ""
    .InputMessage = ""
    .ErrorMessage = ""
    .ShowInput = True
    .ShowError = True
End With

' Select the sheet coinciding with the cell "A2" value
For j = 3 To Sheets.Count

    If Sheets(j).Range("A2").Text = Sheets(1).Range("A2").Text Then
        'Write 4 in sheet1 cell C6 when the two values are coinciding.
        Sheet1.Range("C6") = 4
    End If

Next j
End Sub

问题在于
If…
行,可能是范围定义。我试过
.Text
.Value
两种方法都不起作用。

您可以使用
精确(text1,text2)
函数

If StrComp(Sheets(j).Range("A2").Value2, Sheets(1).Range("A2").Value2, _
    vbTextCompare) = 0 Then
'added the underscore since I made it two lines for neatness
vbTextCompare
不区分大小写,
vbBinaryCompare
区分大小写。网上有一些资源可以帮助你

另外,我注意到您正在使用
工作表\u Change
并更改
工作表1
上单元格的值。我猜您的
工作表\u更改
是针对
工作表1
,是吗?如果是这种情况,那么每次修改
Sheet1
,子系统都会再次被调用(一次又一次…直到崩溃)。要防止出现这种情况,您需要添加

Application.EnableEvents = False
到潜艇的开头,然后

Application.EnableEvents = True

最后。这样,您对工作表所做的任何更改都不会触发工作表更改。sub.

该更改保存在VBA项目结构中的何处?应将其保存在要处理更改事件的每个工作表中。另外,您不需要循环,If语句条件应该是
Range(“A2”).Text=Sheets(1).Range(“A2”).Text
,因此代码会抛出一个错误(哪个和在哪里?),或者该条件的计算结果永远不会为True?@MarkM我只在Sheet1中有这一点。“我试过你说的话,但没用。”保罗。我可以完美地编译代码。问题在于您所说的条件。请尝试切换我在回答中提到的
启用事件
,看看是否有效。我已经尝试了您所说的。但它仍然不起作用。。。在for之前,我在表1的单元格“A2”中有一个验证数据列表。当我选中此项时,我想将该单元格与表单3中的其他“A2”单元格与表单的其他单元格进行比较,如果为真,则表单1中的其他单元格中必须显示其他验证数据列表,具体取决于表单。所有的代码都在工作,但我仍然有问题,如果。。。我完成了循环前一步的一点代码。也许还有另一个我看不到的错误,但我看到的是这种情况永远不会实现。如果没有这一点,其余的工作将非常完美。谢谢在代码末尾(在子代码末尾之前),需要再次启用事件(
Application.EnableEvents=True
)。另外,由于您已停用它们,重新激活它们的一个简单方法是只使用以下行生成一个小的子/宏:
Application.EnableEvents=True
。之后,您的
工作表\u Change
应再次成功触发(您当前的代码意味着它仅在第一次更改后运行,然后由于事件被禁用而停止)。当我将代码复制到新工作簿中时,您的代码对我来说似乎运行良好。请确保像我说的那样启用事件。为了清楚起见,请创建一个新的子对象(例如,
Private Sub ReEnable()
),添加启用事件的行,然后运行该宏一次(F5或按编辑器中的按钮)。一旦事件被禁用,仅按“重置”按钮将无法启用事件。我尝试在子项的末尾添加应用程序。EnableEvents=True。但是,当我选择列表上的选项时,它们不会停留在单元格上。另外,如果我在实际子对象的末尾添加一个新子对象,它将不起作用。