【问题标题】:How to establish third variable for Dimmed variable [closed]如何为 Dimmed 变量建立第三个变量 [关闭]
【发布时间】:2021-05-03 05:21:16
【问题描述】:

这是我在这个平台上的第一篇文章,希望能得到一些帮助。我是 excel VBA 的新手,所以如果我没有使用适当的行话或语言,请原谅我!

我正在开发一个使用 excel VBA 的库存管理系统。它依赖于检索每个 SKU 的当前库存的用户表单。更新者从 4 种类型的数量更新中进行选择,其中包括:

a) 拣货清单(为项目提取的库存), b) 进货(收货), c) 退货(未从项目中使用的剩余/余额 SKU) d) 物品转移(SKU 从一个仓库转移到另一个仓库)

流程如下:

  1. 工作人员启动库存更新。
  2. 填写与更新类型相关的详细信息(例如,领料单将链接到项目任务号等)
  3. 使用相关 SKU、仓库和数量更新必要的更新类型
  4. 在将数字提交到相应的 Excel 表之前确认数量
  5. 提交后,信息将连接到相应的 Excel 表,工作人员可以在其中 a) 保存为 PDF 以供归档,b) 执行命令,根据各自的 SKU。这也已由 VBA 编码,但是,在更新两个仓库的 SKU 数量时,我遇到了问题。

我面临的问题:

我使用 Dim 作为范围来建立我的变量(例如 rng1、rng2、rng3、cell1、cell2、cell3)。用4个变量(rng1,rng2,cell1,cell2)执行宏没有问题,但是在引入rng3和cell3时,宏出现循环问题。

    Sub VosToNetTransfer()

MsgBox "Transferred product(s) to NETLINE successfully!"

Dim rng1, rng2, rng3, cell1, cell2, cell3 As Range

Dim lastRow1 As Long
lastRow1 = Sheets("VosToNet").Range("A" & Rows.Count).End(xlUp).Row
Set rng1 = Worksheets("VosToNet").Range("B13:B" & lastRow1)

Dim lastrow2 As Long
lastrow2 = Sheets("InventoryMaster").Range("A" & Rows.Count).End(xlUp).Row
Set rng2 = Worksheets("InventoryMaster").Range("A4:A61" & lastrow2)

Dim lastrow3 As Long
lastrow3 = Sheets("InventoryMaster").Range("A" & Rows.Count).End(xlUp).Row
Set rng3 = Worksheets("InventoryMaster").Range("A65:A87" & lastrow3)



For Each cell1 In rng1
    If IsEmpty(cell1.Value) Then Exit For

    For Each cell2 In rng2
        If IsEmpty(cell2.Value) Then Exit For
        
        For Each cell3 In rng3
        If IsEmpty(cell3.Value) Then Exit For
        
    If cell1 <> cell2 Then Exit For
    If cell2 <> cell3 Then Exit For
    If cell3 <> cell1 Then Exit For
         
            If cell2 = cell1 Then
                cell2.Offset(0, 2) = cell2.Offset(0, 2) + cell1.Offset(0, 2)
                cell3.Offset(0, 2) = cell3.Offset(0, 2) - cell1.Offset(0, 2)
                             
             End If
                
         Next cell3
         Next cell2
         Next cell1          

End Sub

这是我用于尝试将数量从一个仓库转移到另一个仓库的当前代码。但是,它不起作用。

基本上,我的 rng1 是更新表上的 SKU 代码,rng2 是主表上的 SKU 代码。当 cell1 与 cell2 匹配时,该特定数量会减去/加上 .Offset。但是,我的局限性在于我正在使用 SKU,其中一些在两个仓库中都可用,因此在更新两个仓库的数量时,假设我认为我必须为另一个仓库的 SKU 代码建立另一个 rng3 .如何使用单个命令按钮更新不同仓库的数量?另外,如何根据更新表将数量从一个仓库转移到另一个仓库?

如果您需要更多说明,我将能够提供尽可能多的支持细节/图片。

TLDR;我希望能够建立第三组变量(rng3,cell3),这样; 当 cell1 = cell2 时,然后从 rng2 中的 SKU 中相应地减去/添加。 当 cell2 = cell3 时,则从 rng3 中的 SKU 中相应地减去/添加。

提前谢谢你!

【问题讨论】:

  • 您的代码存在多个问题。更重要的是,很难理解代码应该做什么。尝试在传输之前和之后添加工作表的图像,并以代码为重点。
  • 您好,不幸的是,我也不完全确定某些代码应该做什么。所有这些都是从网上各种论坛帖子中提取的。用外行的话来说,如果 cell1 = cell2,我希望 cell1 的 .Offset(0, 2) 与 cell2 的 .Offset(0, 2) 相加/减去,以及 cell1 的 .Offset(0, 2) 相加/如果 cell1 = cell3,则从 cell3 的 .Offset(0, 2) 减去/减去。是否可以在同一个潜艇中进行?

标签: excel vba offset


【解决方案1】:

比较范围的单元格

  • 请注意,这是一个“介绍性”(学习)代码。它可以在多个帐户上进行改进(使用Application.Match、使用数组、仅使用一个循环(在另一个过程中)、更好的单元格值测试...)。
  • 它将遍历每个Destination Ranges 的所有单元格(外循环),并将它们的值与Source Range 的单元格(内循环)的值进行比较,如果匹配,则执行所需的操作。 Exit For 将在找到匹配项时退出内部循环。

守则

Option Explicit

Sub VosToNetTransfer()
    
    's - Source: read from
    'd - Destination: write to
    
    Dim wb As Workbook: Set wb = ThisWorkbook ' Workbook containing this code.
    
    MsgBox "Transferred product(s) to NETLINE successfully!" '?
    
    Dim srg As Range, drg As Range
    Dim sCell As Range, dCell As Range
    Dim LastRow As Long
    
    ' Define Source Range.
    LastRow = wb.Worksheets("VosToNet").Range("A" & Rows.Count).End(xlUp).Row
    Set srg = wb.Worksheets("VosToNet").Range("B13:B" & LastRow)
    
    ' Define First Destination Range.
    Set drg = wb.Worksheets("InventoryMaster").Range("A4:A61")
    
    For Each dCell In drg.Cells
        If Len(dCell.Value) > 0 Then
            For Each sCell In srg.Cells
                If sCell.Value = dCell.Value Then
                    dCell.Offset(, 2).Value = dCell.Offset(, 2).Value _
                        + sCell.Offset(, 2).Value
                    Exit For
                End If
            Next sCell
        End If
    Next dCell
        
    ' Define Second Destination Range.
    Set drg = wb.Worksheets("InventoryMaster").Range("A65:A87")
    
    For Each dCell In drg.Cells
        If Len(dCell.Value) > 0 Then
             For Each sCell In srg.Cells
                 If sCell.Value = dCell.Value Then
                     dCell.Offset(, 2).Value = dCell.Offset(, 2).Value _
                         - sCell.Offset(, 2).Value
                     Exit For
                 End If
             Next sCell
        End If
    Next dCell

End Sub

【讨论】:

  • 您好,感谢您的及时回复!我已经尝试了代码,它就像一个魅力。我有另一个查询,是否可以执行相同的宏但这次引入另一个条件?例如,WAREHOUSE1 的数量只会在 sCell.Offset(, 0).Value = "WAREHOUSE1" 时更新。 WAREHOUSE2 反之亦然
  • 不完全确定你的意思,但你可以尝试类似If sCell.Value = dCell.Value And sCell.Offset(, 1).Value = "WAREHOUSE1" Then(或者可能是dCell.Offset(, 1).Value = "WAREHOUSE1"并用你需要的偏移量替换10没有意义. 正如我之前在您的 cmets 中所写的,没有图像,这是一种猜谜游戏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
相关资源
最近更新 更多