【问题标题】:Using VLookup function to find a cell to change its value使用 VLookup 函数查找单元格以更改其值
【发布时间】:2020-01-29 02:30:49
【问题描述】:

我正在尝试连接到工作簿以跟踪订单。一个工作簿(Book1)显示订单号、总数量和当前数量(到目前为止已完成)以及生产办公室的周订单列表。另一个工作簿(Book2)在工作站上,供操作员在零件完成时输入新订单号和当前数量。

代码的前半部分运行良好。它成功更新了 order# 并将其从 Book2 粘贴到 Book1。我无法完成的是将表格的“状态”列中的单元格更新为刚刚粘贴到工作簿中的相应订单号为 1 或 2。我将表格格式化为空白单元格为红色的位置(订单未激活),1 = 黄色(订单已打开)和 2 = 绿色(订单完成)。

我尝试使用订单计数为 0 的“IF”关闭下面的代码,因为它会在粘贴新订单#之前重置。 注意:订单可能不会按照它们列出的顺序完成,所以它必须是某种类型的查找。我不能只在“状态”列中找到最后一个空单元格。

更新* 想通了!如果其他人遇到此线程,下面的代码现在可以正常工作!

感谢以下 cmets 中的每个人。

Private Sub CommandButton1_Click()
   Dim wbEntry As Workbook
   Set wbEntry = ThisWorkbook
   Dim wbCount As Workbook
   Set wbCount = Workbooks("MO# Count.xlsm")

   wbEntry.Sheets("Sheet1").Range("B3").Copy

   wbCount.Activate
   wbCount.Worksheets("Golf Cart").Range("V5").Select
   ActiveCell.PasteSpecial xlPasteValues

  Dim Fnd As Range
   Set Fnd = Sheets("Golf Cart").Range("A:A").Find(Sheets("Golf Cart").Range("V5").Value, , , xlWhole, , , False, , False)
   If Not Fnd Is Nothing Then
      Set Fnd = Fnd.Offset(0, 2)
   End If

   Fnd.Value = 1


   ActiveWorkbook.Save

   wbEntry.Activate

   Application.CutCopyMode = False

   wbEntry.ActiveSheet.Range("H2").Select

End Sub

【问题讨论】:

  • 其实没有问题。如果你得到错误,请告诉哪一行和哪一行。如果您没有收到错误,请告诉代码到底有什么问题。请注意“It’s not working” is not helpful。 • 同样Status = Application.WorksheetFunction.VLookup(MONum, MOlist, 3, False).Select 这一行必须没有.Select:您可能会从阅读How to avoid using Select in Excel VBA 中受益。
  • 查找列研究中的最后一个单元格range.End(xlUp)
  • 我需要能够编辑 Vlookup 找到的单元格。如果不选择,那么在找到该单元格后如何编辑该单元格的值?
  • 尝试使用FIND返回对找到的单元格的引用。
  • 是的,您需要find 才能找到包含YMM…759 的单元格。所以实际上你有该单元格的 reference (它不适用于值)并将该引用放入变量 FoundCellReference 然后您可以使用 Range.Offset property 从该单元格移动 2 列向右写一个值。例如FoundCellReference.Offset(ColumnOffset:=2).Value = 5。去吧,这是正确的方法。

标签: excel vba


【解决方案1】:
  • 如果你写What:="MO",那么你搜索的是文本“MO”,而不是变量MO 中的值。要使用变量你必须写What:=MO

  • 为每个 Range 对象指定它所在的工作簿/工作表,否则 Excel 可能会假定另一个工作表而不是您想象的。

  • 仅在 A 列中搜索 wsGolf.Columns("A").Find(…),如果您在 Cells 中搜索,则在 所有 单元格中搜索,当然您会总是找到您想要的正在寻找Range("V5"),但这不是您想要的结果。

  • 检查Find 是否成功:If FoundRef Is Nothing Then。如果确实找到了一个单元格,您只能从找到的单元格中Offset

  • 切勿使用.Select.ActivateActiveSheet,始终按名称为所有RangeCells 对象等指定工作表。请参阅How to avoid using Select in Excel VBA

所以下面的内容应该可以帮助你:

Option Explicit

Private Sub CommandButton1_Click()
    Dim wbEntry As Workbook
    Set wbEntry = ThisWorkbook

    Dim wbCount As Workbook
    Set wbCount = Workbooks("MO# Count.xlsm")

    wbEntry.Worksheets("Sheet1").Range("B3").Copy

    Dim wsGolf As Worksheet
    Set wsGolf = wbCount.Worksheets("Golf Cart")

    wsGolf.Range("V5").PasteSpecial xlPasteValues

    Dim MO As Range
    Set MO = wsGolf.Range("V5")

    Dim FoundRef As Range
    Set FoundRef = wsGolf.Columns("A").Find(What:=MO, After:=wsGolf.Range("A1"), LookIn:=xlValues, LookAt:=xlPart, _
                                     SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)

    If FoundRef Is Nothing Then
        MsgBox "'" & wsGolf.Range("V5") & "' was not found.", vbCritical
        Exit Sub
    End If

    FoundRef.Offset(ColumnOffset:=2).Value = 1
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-13
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多