在VBA中切换工作表无法按我希望的方式工作

在VBA中切换工作表无法按我希望的方式工作,vba,excel,Vba,Excel,我在一个工作簿中切换工作表时遇到问题。请看以下内容: Set chs = Range("1:1") Set Employ = chs.Find("Employee") Set Sal = chs.Find("Salary") Worksheets("Sheet1").Activate a = Range(Columns(Employ.Column), Columns(Sal.Column)).Select Worksheets("Sheet2").Activate b = Range(Colu

我在一个工作簿中切换工作表时遇到问题。请看以下内容:

Set chs = Range("1:1")
Set Employ = chs.Find("Employee")
Set Sal = chs.Find("Salary")

Worksheets("Sheet1").Activate
a = Range(Columns(Employ.Column), Columns(Sal.Column)).Select
Worksheets("Sheet2").Activate
b = Range(Columns(Employ.Column), Columns(Sal.Column)).Select
我想让程序做的是激活sheet1,然后选择标题为Employee and Salary的列,我在下面定义了这些标题,然后激活sheet2,然后再次选择标题为Employee and Salary的列,这些标题专门位于激活的工作表中

然而,这就是它正在做的事情。假设在表1中,员工和工资的列是A和F。这两个列之间的所有内容都可以选择。但在激活sheet 2时,如果我尝试选择分别为B列和K列的employee列和salary列,它仍然只会选择A列到F列。相反的情况也会发生:如果我先激活sheet 2,它会选择sheet 1中的B列到K列,这与标题不匹配

非常感谢您的帮助。

按照您设置Employ变量的方式,它不会在每次切换工作表时更改。在本例中,您的程序首先在1:1范围内查找Employ字符串,但不清楚该字符串在何处:它将位于激活的工作表中

从上下文来看,听起来您需要一个动态查找Employ和Sal的函数。也许您需要这样一个函数:

Function FindEmploy(sht As Worksheet) As Range
    Set FindEmploy = sht.Range("1:1").Find("Employ")
End Function
FindSal的情况也类似。那么您的代码将类似于:

Dim sht1 As Worksheet
Set sht1 = Worksheets("Sheet1")
sht1.Activate
a = sht1.Range(Columns(FindEmploy(sht1).Column), Columns(FindSal(sht1).Column)).Select

与Sheet2和b类似。

您应该在其前面加上一个sheet限定符,明确说明您的范围:Hi@MacroMarc谢谢您的消息。老实说,虽然我不知道这意味着什么,你能给我更多的指导吗?将帮助您理解。@MacroMarc我查看了线程,并尝试实施更改,例如首先定义我的范围,但我仍在努力使其正常工作。我对这一点很陌生,已经在这个问题上纠缠了一段时间。请您更明确地说明我需要做什么,@MacroMarc建议您根据特定的工作表定义Employ。类似Set chs=ThisWorkbook.WorksheetsSheets1.Range1:1的内容应保证chs始终引用Sheet1的顶行。通常,您应该始终使用其工作表名称引用范围,以避免任何意外。请看下面我的答案。我建议使用更通用的函数来查找任何标题字符串,因为这是FindEmploy和FindSal函数之间的唯一区别:函数FindHeaderSt作为工作表,标题作为字符串作为范围//Set FindHeader=sht.Range1:1.FindHeader//结束函数道歉,但是//意味着新的直线使用With来限定每个工作表中的语句,或者使用sht作为Columns属性的开头-为了健壮性,或者正如您所说的避免意外…@lebelinoz这非常有用,让我更进一步,谢谢。但是我现在遇到了另一个问题:我想用一个vlookup来代替a和b作为选择函数,对于a,我想在第一张表中找到一个员工的工资,对于b,我想在第二张表中找到一个员工的工资,使用第一张表中的员工姓名,这样我可以比较工资。检索一个works查找,但对于b,其中第一个参数指定为sht1.rangeFindEmployerst1.address.Offset1,0,我认为它可能在这里播放。有什么建议吗?谢谢。这听起来像是一个全新的问题。请接受这个问题的答案,我很乐意为您解答任何新问题。@lebelinoz遗憾的是,我现在不能再问其他问题了。