Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Excel工作表对象不等于同一工作表对象_C#_Excel_Vba - Fatal编程技术网

C# Excel工作表对象不等于同一工作表对象

C# Excel工作表对象不等于同一工作表对象,c#,excel,vba,C#,Excel,Vba,守则第一部分: activeWorksheet = Globals.ThisAddIn.Application.ActiveSheet; var allWorksheets = new List<Worksheet>(); 但是,当我在后台将其作为任务运行时,它不起作用。当我执行最后一次比较时,它返回false,即使它打印了Sheet1和Sheet1 new Task(() => { allWorksheets.Add(activeWorksheet); De

守则第一部分:

activeWorksheet = Globals.ThisAddIn.Application.ActiveSheet;
var allWorksheets = new List<Worksheet>();
但是,当我在后台将其作为任务运行时,它不起作用。当我执行最后一次比较时,它返回
false
,即使它打印了Sheet1和Sheet1

new Task(() =>
{
    allWorksheets.Add(activeWorksheet);
    Debug.WriteLine(activeWorksheet.Name); //prints Sheet1
    Debug.WriteLine(allWorksheets[0].Name); //prints Sheet1
    Debug.WriteLine(allWorksheets[0] == activeWorksheet); //prints false
}

Excel中的工作表是否存在一些奇怪的背景行为?我暂时求助于比较工作表名称,但这是否有效?

我也遇到了类似的问题。我为
Interop.Excel.Worksheet
创建了一个包装器对象,并实现了以下方法:

 Public Overrides Function Equals(obj As Object) As Boolean

    Dim other = TryCast(obj, Worksheet)
    If other Is Nothing Then Return False
    Return ParentsAreEqual(other) AndAlso _worksheet.Name.Equals(other._worksheet.Name) 

End Function

Private Function ParentsAreEqual(other As Worksheet) As Boolean

    Dim result As Boolean
    Try
        result = _worksheet.Parent.Equals(other._worksheet.Parent)
    Catch ex As Exception
        result = False
    End Try
    Return result

End Function

Public Overrides Function GetHashCode() As Integer

    Try
        Return _worksheet.Parent.GetHashCode() Xor _worksheet.Name.GetHashCode
    Catch ex As Exception
        Return 42
    End Try

End Function

还可以通过检查工作簿名称来概括对象比较。否则,如果两个打开的工作簿具有相同的工作表名称,则可能会得到错误的结果。下面是一个简单的函数:

Function Worksheet_is_worksheet(sh1 As Worksheet, sh2 As Worksheet) As Boolean
   'Function to circumvent (known but unresolved) issues with object comparison for 
    'worksheets

    Worksheet_is_worksheet = (sh.Name = sh2.Name) And _
        (sh.Parent.Name =  sh2.Parent.Name)

End Function

你能发更多的代码吗?
activeWorksheet
是如何声明的/在哪里?它是如何设置的?所有工作表都有同样的问题。我只能猜。。。在这里,编译器关闭在lambda表达式之外声明的变量,并且编译器可能必须创建一个包含执行代码所需的所有变量的新类。您必须反编译并观察生成的内容,以便找出上次比较返回false的原因。我有一个类似的问题。我认为
工作表
没有正确实现Equals方法。因此,如果它是同一个实例,那么它是相等的,但是如果创建了同一工作表的新实例,那么Equals方法返回false。我只是检查了工作表名称,因为Excel不能有重复的工作表名称,这对于我的情况来说已经足够了,但这也很好。
Function Worksheet_is_worksheet(sh1 As Worksheet, sh2 As Worksheet) As Boolean
   'Function to circumvent (known but unresolved) issues with object comparison for 
    'worksheets

    Worksheet_is_worksheet = (sh.Name = sh2.Name) And _
        (sh.Parent.Name =  sh2.Parent.Name)

End Function