首页 > 解决方案 > 每次单击宏按钮时,VBA都会将用户表单中的新行和数据插入另一个工作表

问题描述

我有一个手动制作的表单(文本字段),它使用 vlookup 根据输入的唯一 ID 返回这些字段对应的值。示例:ID:0001(静态编号) 类型:vlookup value1 价格:vlookup value 2 所有者:vlookp value 3 另一个只需要每次在第一表行中插入该 ID 的表,称为“ID”,示例:row1“ ID”其他列行返回一个 vlookup 调用公式。

但我需要的是,每次我在表单 ID 字段中输入新值(从表单 1 中)并点击插入宏按钮;VBA 将该用户键入的“id”与在表“ID”列 rows(sheet2) 中找到的 id 进行比较,如果没有找到键入的 ID;插入与上述格式相同的新行,并将新 ID 插入该新行的第一行;还要检查表中的另一个行值(称为:Type,单独放置在单独的行中)并与另一个用户表单字段(称为:Type)值(来自工作表 1,就像 ID 一样),如果它是不同的值然后复制相同的行格式并粘贴新类型字段的值,然后执行第一步并在“新“类型”行下方的新行中插入 ID。实际上我从该代码开始但它'Paste:=xlPasteFormats, Operation:=xlDown例如。

Sub add_item()
'
' add_item Macro
'

'
  Sheets("AJOUTER_PV").Select
  Range("K6").Select
    Selection.Copy
    Sheets("Inventaire").Select
    Range("A5502").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
  If Sheets("AJOUTER_PV").Range("K6").value <> Sheets("Inventaire").Range("A5502").value Then
  
   Range("A5577:AF5577").Select
    Selection.EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove
    Range("A5502").Select
    ActiveWindow.SmallScroll ToRight:=3
    Range("A5502:AL5502").Select
    Selection.Copy
   
    Range("A5577:AL5577").PasteSpecial Paste:=xlPasteFormats, Operation:=xlDown

    Application.CutCopyMode = False
    End If
End Sub

*其中 Range("K6") 是用户表单中的 Id 字段。
Range("A5502") 是表中的 Id 字段,ID 将第一次插入到“A5502”中,然后是“A5503”等。
**在表的每一行之前,都有“Type”行(在单独的合并到一个单元格行中),在这里我们需要检查用户和表格的类型,以了解我们是否需要使用用户表单中的新数据插入新的类型行,然后插入带有“用户表单中的 ID”值与使用“ID”参考的预制 vlookup 自动完成行的 ID 行相同的格式(+ 公式)。 表格

标签: excelvba

解决方案


更新版本的代码(重建表“Inventaire”,因此实际单元格与更新后的代码中的一样......但这个代码的问题实际上我不需要一个单元格与另一个单元格保持相等,但每个单元格都需要一系列复制粘贴执行代码时,“CBR”列下方的新行中的时间。

Option Explicit

Sub Add_Item()

    ' declare all variables
    Dim WsPV        As Worksheet                ' Sheets("AJOUTER_PV")
    Dim WsInv       As Worksheet                ' Sheets("Inventaire")
    Dim Id          As Variant                  ' referenced CBR
    
    ' assign values / objects to the declared variables
    Set WsPV = Worksheets("AJOUTER_PV")
    Set WsInv = Worksheets("Inventaire")
    
    ' use the Cells collection to address cells
    ' syntax is Cells([Row number], [Column number or name])
    Id = WsPV.Cells(6, "K").Value
    WsInv.Cells(4, "A").Value = Id
    ' you could also use:- WsInv.Cells(5502, "A").Value = WsPV.Cells(6, "K").Value
    
    '  What 's this? You just made A5502 = K6!
     If Sheets("AJOUTER_PV").Range("K6").Value <> Sheets("Inventaire").Range("A4").Value Then
   WsPV.Rows(5).EntireRow.Insert Shift:=xlDown
    WsPV.Rows(5).EntireRow.Insert CopyOrigin:=xlFormatFromLeftOrAbove
    ElseIf Sheets("AJOUTER_PV").Range("K6").Value = Sheets("Inventaire").Range("A4").Value Then
    ' not clear what you intend, either from your code or you text
    ' so, here is some syntax you might adapt
   
    
    WsInv.Range("A4:H4").Copy Destination:=WsInv.Cells(5, "A")
    Application.CutCopyMode = False
    End If
End Sub

因此,在添加新行之前,此代码始终将相同的值复制到第一行,然后将新值添加到第二行,这始终只给出 2 行和重复数据..


推荐阅读