【问题标题】:For each loops and Offsets对于每个循环和偏移量
【发布时间】:2018-07-20 14:39:16
【问题描述】:

我正在使用 VBA 开发代码,但在执行在一个工作表中搜索范围以查找字符串的任务时遇到了问题;然后将字符串记录在同一行中,但为所有出现的情况保留一列(因此 .offset(0, -1));然后它在另一个工作表中搜索每个记录的字符串,并将与该列右侧记录的字符串对应的整数相加。

Option Explicit
Option Base 1

Public Sub StoredProcTimes()
    Worksheets("Proc Time").Select
    Dim Table() As Variant, nItem As Integer
    Range("A2", Range("A2").End(xlDown).End(xlToRight)).Name = "ProcTime"
    nItem = Range("ProcTime").Rows.Count
    ReDim Table(nItem, 2)
End Sub

Public Sub DayLoad()
    Range("G2", Range("G1").End(xlDown)).Name = "Dates"
    Call StoredProcTimes
    Dim reply As Date, cell As Range, sum As Integer
    reply = InputBox("Specify Date", "Day Load", "9/1/2017")
    For Each cell In Range("Dates")
        If cell.Value = reply Then
            cell.Offset(0, -1).Value

        End If
    Next
    MsgBox "The load for " & reply & " is " & sum & " minutes"
End Sub

【问题讨论】:

  • 请在您的问题中包含您的代码。
  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。见:minimal reproducible example
  • 这听起来像是可以用SUMIFS或SUMPRODCT函数完成的,这必须是VBA吗?
  • 现在,请解释错误的性质以及您在哪一行得到错误。
  • 感谢您对 cell.offset 的建议,现在我有了所需的值,我对如何在另一个工作表中搜索它们感到困惑

标签: vba excel if-statement foreach


【解决方案1】:

首先,您的线路cell.Offset(0, -1).Value 没有做任何事情。您没有将其设置为等于一个值。您应该在此处收到错误消息。

不使用Offset() 是我个人的偏好,但使用它并不一定是什么大问题。在我的示例中,我向您展示了一种我认为有利的替代方法。

对于您要查找的特定单元格,不要遍历范围,这会占用处理器时间。使用Range.Find()

Public Sub DayLoad()

    Dim ws As Worksheet, rngG As Range

    ' You may need to change the index, or use "SheetName"
    Set ws = ThisWorkbook.Worksheets(1)
    Set rngG = ws.UsedRange.Columns("G")

    'Call keyword is unnecessary 
    Call StoredProcTimes

    Dim sReply As String, myCell As Range
    sReply = InputBox("Specify Date", "Day Load", "9/1/2017")
    If Not IsDate(sReply) Then Exit Sub

    ' Search for your date
    Set myCell = rngG.Find(sReply)

    ' If date was found, then copy the date to the left 1 col
    If Not myCell Is Nothing Then
        With myCell
            ws.Cells(.Row, .Column - 1) = .Value
        End With
    End If

End Sub

【讨论】:

  • 感谢您的反馈;复制单元格左侧的值后,是否将其存储为变量并在另一张表中搜索该值?
  • @WillParker 它已经存储为变量sReply。如果您还需要搜索另一张工作表,也可以使用它。
  • sReply 不会是对输入框的响应,即日期吗? sReply = InputBox("指定日期", "日负荷", "9/1/2017")
  • 在最后一行中,您使用了未声明的变量 replysum
  • @WillParker 是输入框的响应,也是你询问的值。如果您的值的变量已经存在,为什么还要创建另一个变量?仅仅因为你曾经使用过你的变量并不会抑制你再次重用它的能力。 // 谢谢费尔南多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 2011-06-20
相关资源
最近更新 更多