问题描述
我需要知道什么?
我在做什么?
我有一些代码循环遍历i并为其分配一个值,然后根据i ...从工作表中提取单元格值。所以(i,2)很简单:第2列中的第i行。然后显示在用户窗体的文本框中。
我想做什么?
添加dbl_click事件,以便某人可以双击文本框并将其发送到正在显示的工作表/行/列。创建dbl_click事件没有问题,但是我的问题似乎是如何获取显示的单元格位置?
如果相关,这是我的循环代码:
Dim code as String
code = search.Value
For i = 2 To LastRow
If Sheet1.Cells(i,9).Value = code Then
ssn1.Text = Sheet1.name
hb11.Text = Sheet1.Cells(i,9).Value
End If
Next i
这是一个片段,由于进行了一段时间,因此hb11可以运行到hb37-没有任何理由将其全部粘贴到这里。
问题在于,循环还会遍历多个工作表,找到“代码”的所有示例,因此在将数据写入TextBox之后,我会不断更改-因此我不能依靠(i ,9)。
我已经在代码方面做到了这一点:
Sub bt11_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
If hb11.Value <> ("") Then
Application.Goto Reference:=Sheet1.Range(hb11)
End If
End Sub
但是,这似乎取决于hb11的值,而不是单元格的位置。
我知道这是一个愚蠢的问题,但是我似乎找不到答案?
我感觉它位于:
Dim cell as Range
然后:
Set cell = hb11.something
但是我已经遍历了列表,单元格/范围不匹配,并且实际上不存在于列表中。没有我认为可以做到的“链接单元” ...
我有点迷茫。
解决方法
使用.Tag
属性的利润
我假设您的27个文本框中的每个文本框都恰好指向一个由范围名称,行和列(或列字符)组成的源范围地址。
如果是这样,您可以在初始化循环期间,例如,将组合的参考字符串(例如"Sheet22" & "," & i & "," & 9
)分配给文本框的►.Tag
属性,从中受益。以逗号分隔的方式,例如
hb11.Tag = "Sheet22,17,9" ' << i.e. sheet name,row 17,column 9
我认为从那里获取所有数据很容易:
Dim src: src = split(hb11,",")
Application.Goto Reference:= _
ThisWorkbook.Worksheets(src(0)).Range(Cells(Val(src(1)),Val(src(2))).Address),Scroll:=True
,
很多小时后,我已经解决了。
感谢T.M.关于从存储位置重写数据的想法。
在所有子控件之外,我还在顶部创建了一个字符串。
Dim ac1 As String
在循环中,我只是给ac1值i,
For i = 2 To LastRow
If Sheet1.Cells(i,9).Value = code Then
ssn1.Text = Sheet1.name
hb11.Text = Sheet1.Cells(i,9).Value
ac1 = i
End If
Next i
这行得通,因为您只运行此循环,所以存在IF代码,因为列表是唯一的,所以代码仅存在一次。因此,您只需进入循环一次,当您这样做时,i =该行。
然后我用T.M.的想法写下:
Application.Goto Reference:=Sheet1.Range("A" & ac1)
这是Goto可以处理的范围参考。
此方法的优点是,因为我要搜索具有多个文本框的多个工作表,所以只需要ac1即可获取整个文本框的价值。
希望这对以后的人有帮助。