Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Forms Excel创建自动填写表单_Forms_Excel_Vlookup_Vba - Fatal编程技术网

Forms Excel创建自动填写表单

Forms Excel创建自动填写表单,forms,excel,vlookup,vba,Forms,Excel,Vlookup,Vba,我正在尝试创建一个包含两个条目的表单: -文件夹编号 -文件夹中的Tom列表 这是为了存档。表格分为4个部分,将打印在档案箱标签上。 文件夹的编号范围为1到1500,其中一些文件夹包含1个文档,一些文件夹最多包含10个文档。现在,我只是通过从如下表中复制来手动执行此操作: 表格里我只需要这张桌子上的汤姆号码 我试图使用VLOOKUP,但它只返回搜索文件夹编号的第一行。 所以基本上我想要一个函数,它将从标签表单中获取文件夹编号,并找到分配给它的所有Tom,然后将其写在下面。文件夹编号中的前3位

我正在尝试创建一个包含两个条目的表单: -文件夹编号 -文件夹中的Tom列表 这是为了存档。表格分为4个部分,将打印在档案箱标签上。 文件夹的编号范围为1到1500,其中一些文件夹包含1个文档,一些文件夹最多包含10个文档。现在,我只是通过从如下表中复制来手动执行此操作:

表格里我只需要这张桌子上的汤姆号码

我试图使用VLOOKUP,但它只返回搜索文件夹编号的第一行。
所以基本上我想要一个函数,它将从标签表单中获取文件夹编号,并找到分配给它的所有Tom,然后将其写在下面。文件夹编号中的前3位不重要,只有最后4位被认为是最重要的变量

不幸的是,vlookup无法工作,您必须使用数组文件夹。我假设您将有一个名为[文件夹]的表 我将使用一些vba创建一个表单,介绍如何执行此操作。
1.通过选择文件夹数据集并按ctl+T创建表

  • Alt+F11进入Visual basic编辑器
  • 在顶部选择insert==>UserForm
  • 按F4键,在“属性”窗口中命名表单文件查找器
  • 如果您的工具箱没有选择view=>toolbox打开,它可能不会出现
  • 拖动2个标签、2个列表框和2个按钮,您可以随意设置格式。

    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