excel - 每次单击宏按钮时,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 行相同的格式(+ 公式)。
解决方案
更新版本的代码(重建表“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 行和重复数据..
推荐阅读
- mysql - 将数据从 rest api 推送到 sql 数据库的最佳方法是什么?
- javascript - 弹出窗口和停止计数器需要 JavaScript 帮助
- javascript - JS 表达式,用于根据先前响应输出中的多个变量计算和设置输入值
- node.js - 使用带有过滤器的 Mongoose .find() 调用 API 不返回任何内容?
- arrays - 如何访问深层嵌套的 json 即转换为 json 的肥皂 xml 响应
- python - 在 python 上做语音助手
- php - 当 new DateTime() 不应该在没有参数的情况下调用时抑制不必要的@throws 注释?
- jquery - 使用 reCAPTCHA 和密码管理器自动登录
- c# - 如何在隐藏按钮上执行 Click-Event
- python - 张量流中softmax的成本函数