【问题标题】:Looping through each cell in a range and updating SAP database循环遍历范围中的每个单元格并更新 SAP 数据库
【发布时间】:2014-08-09 06:57:43
【问题描述】:

目前,我在 “A1:D10” 范围的每个单元格中都有值。我需要一次将每个单元格值复制到 SAP 应用程序中,我正在使用下面的代码来执行此操作。但问题是它复制了一个单元格 (A1) 4 次,而不是 A1、B1、C1、D1A1 到 D1 单元格更新到 SAP 应用程序后,数据将保存在 SAP 应用程序中,宏应该从 B2 到 D2 开始并执行相同操作。这是我目前正在使用的代码。

这是示例

当前代码宏是复制 (A1) 100 4 次,然后移动到 (B1) 10 4 次,移动到 (C1) 1234 4 次,移动到 (D1) BO 4 次,然后它将转到行A2 并做同样的事情。

但我想要的是它应该将 A1 值 100 复制到 session.findById("wnd[8]/usr/ctxtANLA-BRSKT1").Text = cell.ValueB1 值 10session.findById("wnd[8]/usr/ctxtANLA-MNSRTS2").Text = cell.ValueC1 值 1234session.findById("wnd[8]/usr/ctxtANLA-BUHFT3").Text = cell.ValueD1 值BOsession.findById("wnd[8]/usr/ctxtANLA-BUYTS4").Text = cell.Value .

希望对你有帮助

Dim rng As Range
Dim Row As Range
Dim Col As Range

Lastrow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
Set rng = Range("A2:D" & Lastrow)

For Each Row In rng.Rows
    For Each cell In Row.Cells

    If cell.Value <> "" Then

        session.findById("wnd[8]/usr/ctxtANLA-BRSKT1").Text = cell.Value
        session.findById("wnd[8]/usr/ctxtANLA-MNSRTS2").Text = cell.Value
        session.findById("wnd[8]/usr/ctxtANLA-BUHFT3").Text = cell.Value
        session.findById("wnd[8]/usr/ctxtANLA-BUYTS4").Text = cell.Value

    End If

Next cell

Next Row

Application.ScreenUpdating = True
Application.DisplayAlerts = True

End Sub

【问题讨论】:

  • 不应该那样做。您确定存储此代码的过程没有被调用 4 次吗?
  • 另外,如果您将范围存储在数组中,然后将数据传输到数据库,则速度会更快,而不是遍历范围中的每个单元格。在这种情况下并不重要,因为A1:D10 是一个非常小的范围......
  • 这只是一个例子,有时我们会有超过 1000 行。我注意到,一旦它进入 For 循环,它就会为所有四个字段复制相同的值,因为它在循环内,但我不知道如何更改代码以工作
  • 以前我们在 SAP 中只有一个单元格,但现在他们又包含了 3 个单元格。所以我在 vba 代码中又添加了三行。我知道我在代码中犯了一个错误,因为我在复制所有四个单元格值后使用了 Next Cell ,但不知道每次如何更改单元格值
  • 我认为相同的单元格值在我的代码中被复制了四次(请参见下文)

标签: vba excel excel-2010 export-to-excel


【解决方案1】:

这是您正在尝试的(未经测试)吗?

Sub Sample()
    Dim i As Long, Lastrow As Long

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    With ActiveSheet
        Lastrow = .Cells(.Rows.Count, 1).End(xlUp).Row

        For i = 2 To Lastrow 
            If .Cells(i, 1).Value <> "" Then _
            session.findById("wnd[8]/usr/ctxtANLA-BRSKT1").Text = .Cells(i, 1).Value

            If .Cells(i, 2).Value <> "" Then _
            session.findById("wnd[8]/usr/ctxtANLA-MNSRTS2").Text = .Cells(i, 2).Value

            If .Cells(i, 3).Value <> "" Then _
            session.findById("wnd[8]/usr/ctxtANLA-BUHFT3").Text = .Cells(i, 3).Value

            If .Cells(i, 4).Value <> "" Then _
            session.findById("wnd[8]/usr/ctxtANLA-BUYTS4").Text = .Cells(i, 4).Value
        Next i
    End With

    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub

对于大范围,我仍然建议使用数组,而不是像我在问题下方的第二条评论中提到的那样遍历行。

【讨论】:

  • 请给我 5 分钟。我会检查并通知你
  • 我已经删除了不必要的代码。我已经更新了上面的帖子。使用代码前请刷新页面:)
  • 当然。我现在只是在测试它
  • 嗨,悉达多,这就是我想要的。我刚刚测试了代码,但不确定为什么资产编号列值没有更新到 SAP 字段中,而其余列正在正确更新。对此有什么想法吗?
  • 对不起悉达多。这是我的错误。它工作得很好。你是最好的 :)。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2018-01-18
  • 2020-01-30
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
  • 2020-06-15
相关资源
最近更新 更多