Forms Excel创建自动填写表单
我正在尝试创建一个包含两个条目的表单: -文件夹编号 -文件夹中的Tom列表 这是为了存档。表格分为4个部分,将打印在档案箱标签上。 文件夹的编号范围为1到1500,其中一些文件夹包含1个文档,一些文件夹最多包含10个文档。现在,我只是通过从如下表中复制来手动执行此操作: 表格里我只需要这张桌子上的汤姆号码 我试图使用VLOOKUP,但它只返回搜索文件夹编号的第一行。Forms Excel创建自动填写表单,forms,excel,vlookup,vba,Forms,Excel,Vlookup,Vba,我正在尝试创建一个包含两个条目的表单: -文件夹编号 -文件夹中的Tom列表 这是为了存档。表格分为4个部分,将打印在档案箱标签上。 文件夹的编号范围为1到1500,其中一些文件夹包含1个文档,一些文件夹最多包含10个文档。现在,我只是通过从如下表中复制来手动执行此操作: 表格里我只需要这张桌子上的汤姆号码 我试图使用VLOOKUP,但它只返回搜索文件夹编号的第一行。 所以基本上我想要一个函数,它将从标签表单中获取文件夹编号,并找到分配给它的所有Tom,然后将其写在下面。文件夹编号中的前3位
所以基本上我想要一个函数,它将从标签表单中获取文件夹编号,并找到分配给它的所有Tom,然后将其写在下面。文件夹编号中的前3位不重要,只有最后4位被认为是最重要的变量不幸的是,vlookup无法工作,您必须使用数组文件夹。我假设您将有一个名为[文件夹]的表 我将使用一些vba创建一个表单,介绍如何执行此操作。
1.通过选择文件夹数据集并按ctl+T创建表
7.创建与添加userform相同的新模块仅选择模块
公共函数CreateSheet(可选名称为String=”“)作为工作表
将ws设置为工作表
设置ws=ThisWorkbook.Sheets.Add
如果名称为“”,则ws.name=name
设置Create=ws
端函数
作为整数的公共函数LastRow()从列A中获取最后一行
LastRow=ActiveSheet.Cells(Rows.count,1).End(xlUp).Row
端函数
公共函数DistintFolders()作为字符串()
Dim list()作为字符串
作为整数的Dim计数器
对于ActiveSheet.Range(“E2:E”和LastRow)中的每个单元格
如果不是IsInList(列表、单元格、值、计数器),则
计数器=计数器+1
重拨保留列表(1到计数器)
列表(计数器)=单元格值
如果结束
下一个细胞
DistintFolders=列表
端函数
公共函数TomNumberByFolder(folderName作为变量)作为字符串()
Dim list()作为字符串
作为整数的Dim计数器
将行数设置为整数
对于ActiveSheet.Range(“B2:B”和LastRow)中的每个单元格
rowNumber=rowNumber+1
如果是正确的文件夹(folderName,rowNumber),则
计数器=计数器+1
重拨保留列表(1到计数器)
列表(计数器)=单元格值
如果结束
下一个细胞
TomNumberByFolder=列表
端函数
公共函数IsInList(ByRef list()作为字符串,比较作为字符串,计数作为整数)作为布尔值
dimlas变体
如果compare=“”,则
IsInList=True
退出功能
如果结束
如果计数=0,则
IsInList=False
退出功能
如果结束
对于列表中的每个l
如果l=比较,则
IsInList=True
退出功能
如果结束
下一个l
IsInList=False
端函数
公共函数IsCorrectFolder(folderName作为变量,rowNumber作为整数)作为布尔值
IsCorrectFolder=(ActiveSheet.Range(“E”和rowNumber)。Value=folderName)
结束功能
Private Sub btnCancel\u单击()
卸下我
端接头
私有子BTN创建_单击()
将ws设置为工作表
如果lstom.ListCount=0,则
MessageBox“请选择一个文件夹”
如果结束
设置ws=ThisWorkbook.Sheets.Add
ws.Cells(1,1).Value=“汤姆数”
ws.Cells(2,1).Resize(Me.lstom.ListCount,1)=Me.lstom.list
端接头
私有子文件夹\u单击()
将文件夹设置为字符串
如果ActiveSheet.name为“数据”,则ThisWorkbook.Sheets为“数据”).Activate“请将其命名为您的数据表的名称
对于i=0到lstFolder.ListCount-1
如果选择了lstFolder.i,则
我,汤姆,明白了
对于TomNumberByFolder(lstFolder.list(i))中的每个
和汤姆
.AddItems
以
下一个s
如果结束
接下来我
端接头
私有子用户表单_初始化()
对于DistintFolders中的每个
使用lstFolder
.AddItems
以
下一个s
端接头
`
请注意,如果您愿意,您可能需要更改工作表名称。我会将此信息发送给您
你能告诉我“汤姆”是不是文件吗?如果是这样,它们在哪里?不,它们只是我们内部标准名称中归档列表上的条目:OPO A1 W------DL XXX文件夹编号写为1x B20 ZE 122011 YYYY谢谢我正在研究解决方案。这可能需要一些时间。@JamTay317谢谢你,到那时,你找到了:{=INDEX($a$2:$C$7,SMALL(IF($a$a$a$a$a$7=$a$9,ROW($a$a$2:$a$a$7)),ROW(1:1))-1,3)}但是我无法让它在我的表格中工作。我已经创建了一个表单,可以为你完成所有这些。我将在这里发布步骤,如果您需要我的消息,我会将副本发送给您。非常感谢,现在我发现我的表格存在另一个问题,也许您可以帮助我解决它。问题是什么?我将在问题中添加它,这是一个单独的问题,您应该将其作为单独的问题发布
Private Sub btnCancel_Click()
Unload Me
End Sub
Private Sub btnCreate_Click()
Dim ws As Worksheet
If lstTom.ListCount = 0 Then
MessageBox "Please select a folder"
End If
Set ws = ThisWorkbook.Sheets.Add
ws.Cells(1, 1).Value = "Tom Number"
ws.Cells(2, 1).Resize(Me.lstTom.ListCount, 1) = Me.lstTom.list
End Sub
Private Sub lstFolder_Click()
Dim folder As String
If ActiveSheet.name <> "Data" Then ThisWorkbook.Sheets("Data").Activate 'please name this whatever your datasheet is called
For i = 0 To lstFolder.ListCount - 1
If lstFolder.Selected(i) Then
Me.lstTom.Clear
For Each s In TomNumberByFolder(lstFolder.list(i))
With lstTom
.AddItem s
End With
Next s
End If
Next i
End Sub
Private Sub UserForm_Initialize()
For Each s In DistintFolders
With lstFolder
.AddItem s
End With
Next s
End Sub