【问题标题】:variable i=i +1 for visible cells [closed]可见单元格的变量 i=i +1 [关闭]
【发布时间】:2022-02-21 21:16:38
【问题描述】:

我想问一下。我有一个完美运行的代码。当用户在 Excel 中过滤数据时,问题就出现了。一些行将被隐藏。然后变量 i = i + 1 不起作用。 (有效,但贯穿所有行) 基本上,我在问如何仅为可见行设置变量? 谢谢你的帮助!

i = 2
Do
 'If Sheets("FORMAT").Cells(i, 7) Like "*IE-12-2007984*" Then
  'End If
  On Error GoTo Handler
session.findById("wnd[0]").maximize
session.findById("wnd[0]/usr/ctxtI_VBUKR").Text = "1200"
session.findById("wnd[0]/usr/ctxtI_PSPID-LOW").Text = Sheets("Stavby").Cells(i, 7)
session.findById("wnd[0]/usr/ctxtP_VARI").Text = "AKTUALIZACE"
session.findById("wnd[0]/tbar[1]/btn[8]").press
Set myGrid = session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell/shellcont[1]/shell")
Sheets("Stavby").Cells(i, 2).Value = myGrid.getcellvalue(0, "TXT04")
session.findById("wnd[0]/tbar[0]/btn[3]").press
Handler2:
session.findById("wnd[0]/usr/ctxtI_PSPID-LOW").Text = Sheets("Stavby").Cells(i, 7)

i = i + 1
If Sheets("Stavby").Cells(i, 7).Value = "" Then Exit Do
Loop
If Sheets("Stavby").Cells(i, 7).Value = "" Then

Set session = Nothing
Connection.CloseSession ("ses[0]")
Set Connection = Nothing
Set SAP = Nothing
MsgBox "HOTOVO"
Exit Sub
Handler:
 Resume Handler2
 End If
End Sub```

【问题讨论】:

  • Range.SpecialCells(xlCellTypeVisible).
  • 请不要指出 SAP GUI 和 SAP GUI 脚本代码,因为您的问题只是关于 Excel 行过滤。你应该发一个minimal reproducible example。

标签: excel filtering rows


【解决方案1】:

如果你写在“do”之后

   If Not ActiveSheet.rows(i).Hidden then
     goto endOfLoop
   EndIf

然后在“循环”之前的最后,我们放置目标,我们将循环条件更改为j,并将j 的增量放在目标之后以避免无限循环。

EndOfLoop:
j = j + 1
loop

中间的任何代码都不会为隐藏的行运行。我们不会为隐藏行增加 i,因此 i 计算可见行。您需要在循环之前声明并初始化 Dim j as integer = 2,就在 i = 2 之后。
NB 强烈建议使用Option Explicit 和正确声明的变量。 COMPLETE CODE REVISED

i = 2
Dim j As Integer                                                                    'LINE ADDED
j = 2                                                                   'LINE ADDED
Do
   If Not ActiveSheet.Rows(i).Hidden Then                                'LINE ADDED
     GoTo EndOfLoop                                                      'LINE ADDED
   End If                                                                'LINE ADDED
 'If Sheets("FORMAT").Cells(i, 7) Like "*IE-12-2007984*" Then
  'End If
  On Error GoTo Handler
session.findById("wnd[0]").maximize
session.findById("wnd[0]/usr/ctxtI_VBUKR").Text = "1200"
session.findById("wnd[0]/usr/ctxtI_PSPID-LOW").Text = Sheets("Stavby").Cells(i, 7)
session.findById("wnd[0]/usr/ctxtP_VARI").Text = "AKTUALIZACE"
session.findById("wnd[0]/tbar[1]/btn[8]").press
Set myGrid = session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell/shellcont[1]/shell")
Sheets("Stavby").Cells(i, 2).Value = myGrid.getcellvalue(0, "TXT04")
session.findById("wnd[0]/tbar[0]/btn[3]").press
Handler2:
session.findById("wnd[0]/usr/ctxtI_PSPID-LOW").Text = Sheets("Stavby").Cells(i, 7)

i = i + 1
If Sheets("Stavby").Cells(i, 7).Value = "" Then Exit Do
EndOfLoop:                                                                'LINE ADDED
j = j + 1                                                                 'LINE ADDED
Loop
If Sheets("Stavby").Cells(i, 7).Value = "" Then

Set session = Nothing
Connection.CloseSession ("ses[0]")
Set Connection = Nothing
Set SAP = Nothing
MsgBox "HOTOVO"
Exit Sub
Handler:
 Resume Handler2
 End If
End Sub

【讨论】:

  • 这看起来是不错的解决方案,但是,这个变量呢?哪句话应该从哪里开始。我在 Do 之前有 thsi 变量:I=2
  • 我在 Do 之前只为这个变量 I=2 tahts 编辑了代码,我知道变量可以从第 2 行开始,但我想在过滤后的第一个可见行中从这个变量开始。抱歉编辑,我可以在一开始就这样做
  • 我们可以添加第二个变量并使用一个用于循环和一个用于计算活动行数。见修改
  • 对不起,我完全迷失了。我将编辑我在代码中所做的问题
  • 我误会你了,能否给我更详细的说明?
【解决方案2】:

"the first empty rowSOME ROWS 这里只有几行。我可能问错了问题。所以我想从第一个可见行中获取价值,然后继续下一个可见行。我试过你在这里写的。而且还是不行。 这是我所做的,(我暂时没有修改循环) 我现在从第一个隐藏行获得价值并继续 +1 行。

Dim i As Integer
i = 2
Do
If Sheet("Stavby").Rows(i).Hidden Then
     GoTo EndOfLoop
   End If
  On Error GoTo Handler
session.findById("wnd[0]").maximize
session.findById("wnd[0]/usr/ctxtI_VBUKR").Text = "1200"
session.findById("wnd[0]/usr/ctxtI_PSPID-LOW").Text = Sheets("Stavby").Cells(i, 7)
session.findById("wnd[0]/usr/ctxtP_VARI").Text = "AKTUALIZACE"
session.findById("wnd[0]/tbar[1]/btn[8]").press
Set myGrid = session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell/shellcont[1]/shell")
Sheets("Stavby").Cells(i, 2).Value = myGrid.getcellvalue(0, "TXT04")
session.findById("wnd[0]/tbar[0]/btn[3]").press
Handler2:
session.findById("wnd[0]/usr/ctxtI_PSPID-LOW").Text = Sheets("Stavby").Cells(i, 7)
If Sheets("Stavby").Cells(i, 7).Value = "" Then Exit Do
EndOfLoop:
i = i + 1
Loop
If Sheets("Stavby").Cells(i, 7).Value = "" Then

【讨论】:

  • 你还没有说你的代码的目的是什么。也许你可以写一个新问题,说这是我想要做的,这是我的代码,除非它们是符合条件的过滤行,但如果它们被过滤,我不想要它们。
  • 我会打开新问题
猜你喜欢
  • 2019-05-22
  • 1970-01-01
  • 2022-07-13
  • 2017-01-12
  • 2020-12-28
  • 2012-01-13
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多