Excel 用于填充工作表上特定表的用户表单数据

Excel 用于填充工作表上特定表的用户表单数据,excel,vba,Excel,Vba,我一直在到处寻找,并得出了一些结果,但不是我想要实现的 我有两个不同的用户表单,一个用于创建采购订单,另一个用于创建变更单。根据选择的用户表单,一旦输入数据并使用命令按钮,我需要数据来填充表1(对于来自Pouser表单的采购订单)或表2(对于来自CouPerform的变更单)。两个表位于同一工作表上。这可能吗 下面是我目前拥有的代码——无论我运行的是什么用户表单,它总是希望填充同一个表 请注意,UserForm1和UserForm2的代码完全相同,但“Table1”和“Table2”除外 Pri

我一直在到处寻找,并得出了一些结果,但不是我想要实现的

我有两个不同的用户表单,一个用于创建采购订单,另一个用于创建变更单。根据选择的用户表单,一旦输入数据并使用命令按钮,我需要数据来填充表1(对于来自Pouser表单的采购订单)或表2(对于来自CouPerform的变更单)。两个表位于同一工作表上。这可能吗

下面是我目前拥有的代码——无论我运行的是什么用户表单,它总是希望填充同一个表

请注意,UserForm1和UserForm2的代码完全相同,但“Table1”和“Table2”除外

Private Sub SendCOButton_Click()
Dim xSht As工作表
Dim xFileDlg As FileDialog
将xFolder设置为字符串
Dim xYesorNo作为整数
Dim xOutlookObj作为对象
Dim xEmailObj作为对象
暗XUSERNG As范围
变暗rng As范围
设置rng=ActiveSheet.ListObjects(“Table2”).Range
最后一排一样长
暗淡无光
将WS1标注为工作表,WS2标注为工作表,WS3标注为工作表
Set WS1=工作表(“原始合同”)
Set WS2=工作表(“采购订单模板”)
设置WS3=工作表(“项目快照”)
'查找数据库中的第一个空行
iRow=WS1.Cells.Find(What:=“*”,SearchOrder:=xlRows_
SearchDirection:=xlPrevious,LookIn:=xlValues)。行+1
LastRow=WS3.Cells.Find(内容:=“*”,搜索顺序:=xlRows_
SearchDirection:=xlPrevious,LookIn:=xlValues)。行+1
如果工作表function.CountIf(WS3.Range(“A1:A5000”,WS3.Cells(LastRow,1)),
Me.CONo.Value)>0
MsgBox“重复的变更单编号!”,vbCritical
出口接头
如果结束
'将数据复制到数据库
'使用保护和取消保护线路,
'使用您的密码
'如果工作表受保护
使用WS1
以
与WS2
.Range(“H1”).Value=Me.CONo.Value
.Range(“B6”).Value=Me.COTradeList.Value
.范围(“H6”).值=Me.COAttn.Value
.Range(“B7”).Value=Me.COEmail.Value
.Range(“H7”).Value=Me.COPhone.Value
.Range(“H16”).Value=Me.COPrice1.Value
以
与WS3
rng.Parent.Cells(LastRow,1).Value=CONo.Value
rng.Parent.Cells(LastRow,2).Value=COTradeList.Value
rng.Parent.Cells(LastRow,3).Value=COItems.Value
rng.Parent.Cells(LastRow,4).Value=CODescription1.Value
rng.Parent.Cells(LastRow,5).Value=COPrice1.Value
rng.Parent.Cells(LastRow,6).Value=CODateIssued.Value
以
Set xSht=工作表(“采购订单模板”)
设置xFileDlg=Application.FileDialog(msoFileDialogFolderPicker)
如果xFileDlg.Show=True,则
xFolder=xFileDlg。选择编辑项(1)
其他的
MsgBox“您必须指定一个文件夹以将PDF保存到其中。”&vbCrLf&
vbCrLf&“按“确定”退出此宏。”,vbCritical,“必须指定
目标文件夹“
出口接头
如果结束
xFolder=xFolder+“\”&工作表(“采购订单
模板“).范围(“B9”).值和“-采购订单号”和工作表(“采购订单
模板“).范围(“G1”).值和“-”以及工作表(“采购订单
模板“).Range(“B6”).Value和“.pdf”
'检查文件是否已存在
如果Len(Dir(xFolder))>0,则
xYesorNo=MsgBox(xFolder&“已存在”。&vbCrLf&vbCrLf&“Do
是否要覆盖它?”_
vbYesNo+vbQuestion,“文件存在”)
出错时继续下一步
如果xYesorNo=vbYes,则
杀死xFolder
其他的
MsgBox“如果不覆盖现有PDF,我将无法继续。”_
&vbCrLf&vbCrLf&“按“确定”退出此宏。”,
vbCritical,“退出宏”
出口接头
如果结束
如果错误号为0,则
MsgBox“无法删除现有文件。请确保该文件已删除。”
没有打开或写保护。“_
&vbCrLf&vbCrLf&“按“确定”退出此宏。”,
vbCritical,“无法删除文件”
出口接头
如果结束
如果结束
设置xUsedRng=xSht.UsedRange
如果Application.WorksheetFunction.CountA(xUsedRng.Cells)为0,则
'另存为PDF文件
xSht.ExportAsFixedFormat类型:=xlTypePDF,文件名:=xFolder,
质量:=xlQualityStandard
'创建Outlook电子邮件
设置xOutlookObj=CreateObject(“Outlook.Application”)
设置xEmailObj=xOutlookObj.CreateItem(0)
Set xSht=工作表(“采购订单模板”)
使用xEmailObj
.展示
.To=工作表(“采购订单模板”).范围(“B7”).值
.CC=“”
.BCC=“”
.Subject=工作表(“采购订单模板”).Range(“E9”).Value&“
-和“采购订单”和工作表(“采购订单模板”).范围(“G1”).值和
“-”&工作表(“采购订单模板”).范围(“B6”).值
.Attachments.Add xFolder
如果DisplayEmail=False,则
’发送
如果结束
以
其他的
MsgBox“活动工作表不能为空”
出口接头
如果结束
卸下我
端接头

我们不知道您的工作表的布局,但我们可以尝试使用代码了解发生了什么:

本节似乎是(我假设)您更改为参考相应表格的部分:

Dim rng As Range
Set rng = ActiveSheet.ListObjects("Table2").Range
然后,在代码的后面部分,使用以下命令写入工作表:

With WS3
  rng.Parent.Cells(LastRow, 1).Value = CONo.Value
  rng.Parent.Cells(LastRow, 2).Value = COTradeList.Value
  rng.Parent.Cells(LastRow, 3).Value = COItems.Value
  rng.Parent.Cells(LastRow, 4).Value = CODescription1.Value
  rng.Parent.Cells(LastRow, 5).Value = COPrice1.Value
  rng.Parent.Cells(LastRow, 6).Value = CODateIssued.Value
End With
让我们通过分解几行来了解您在这里所做的工作:

首先,您的
With/End With
是不相关的,您根本没有使用WS3。他们可以去。他们不做任何伤害,因为他们什么也不做。此包装中的所有内容都是指与
rng
相关的所有内容

但更重要的是,您正在使用
rng.Parent.cells(LastRow,X)

因此,您参考表格的范围(称为
rng
),然后转到它的
。父项
将是
表格2
所在的工作表,然后从单元格A1使用
LastRow
和x找到单元格

现在,前面,
LastRow
检查WS3工作表以查找最后使用的单元格/行,而不是
rng
Table2
——因此您将基于WS3写入行,而不管
rng
位于何处。
With WS3
  rng.Parent.Cells(LastRow, 1).Value = CONo.Value
  rng.Parent.Cells(LastRow, 2).Value = COTradeList.Value
  rng.Parent.Cells(LastRow, 3).Value = COItems.Value
  rng.Parent.Cells(LastRow, 4).Value = CODescription1.Value
  rng.Parent.Cells(LastRow, 5).Value = COPrice1.Value
  rng.Parent.Cells(LastRow, 6).Value = CODateIssued.Value
End With