Excel/VBA 细分字段

2023-11-29

我必须完成一项复杂的任务,但我会尝试解释。我有一个包含 23000 行数据的 Excel 文件,我正在将其导入到网站中。每个都有一个像这样的字段:

Category | other data | other data 2 

Foods/Dog/Treats Pre-Pack | 1223 | image.jpg

我需要它抓取每一行并在其下面为每个“/”添加一个新行,因此将上面的内容转换为:

Category | other data | other data 2 

[blank in original line] | 1223 | image.jpg

Foods | [blank field] | [blank field]

Foods/Dog | [blank field] | [blank field]

Foods/Dog/Treats Pre-Pack | [blank field] | [blank field]

因此,脚本需要为每个类别添加一个新行,但将原始类别保留在其前面。于是转身category/category2/category 3分为 4 行:[blank] - category - category/category2 - category/category2/category 3

有谁知道执行此操作的方法或脚本?

谢谢,西蒙

注意:该工作表称为“测试”,类别列从 E2 开始,转到 E23521

我有以下脚本:

Sub test()
    Dim a, i As Long, ii As Long, e, n As Long
    Dim b(), txt As String, x As Long
    With Range("a1").CurrentRegion
        a = .Value
        txt = Join$(Application.Transpose(.Columns(5).Value))
        With CreateObject("VBScript.RegExp")
            .Global = True
            .Pattern = "/"
            x = .Execute(txt).Count * 2
        End With
        ReDim b(1 To UBound(a, 1) + x, 1 To UBound(a, 2))
        For i = 1 To UBound(a, 1)
            If a(i, 5) <> "" Then
                For Each e In Split(a(i, 5), "/")
                    n = n + 1
                    For ii = 1 To UBound(a, 2)
                        b(n, ii) = a(i, ii)
                    Next
                    b(n, 5) = Trim$(e)
                Next
            End If
        Next
        .Resize(n).Value = b
    End With
End Sub

这似乎根据我的需要创建了一个新行,但并没有使斜杠结构与每个行一起向上移动。并且不要在所有新类别上添加空行并使原始类别值留空。

SOLVED:

Sub splitEmUp()
    Dim splitter() As String 'this is storage space for the split function
    Dim i As Integer ' main-loop for counter "which cell we are on"
    Dim j As Integer ' splitter for-loop counter "which section of the split are we on"
    Range("E2").Activate 'starting in cell e2 because row 1 is headers and category is located in the B column

   For i = 0 To 24000 'from beginning to end i=0 means e2, i=1 means e3
        ActiveCell.Offset(i, 0).Value = Replace(ActiveCell.Offset(i, 0).Value, " / ", "!@#")
        splitter = Split(ActiveCell.Offset(i, 0), "/") 'split the cell based on / and store it in splitter
        If (UBound(splitter)) > 0 Then 'if a split occurred
            ActiveCell.Offset(i, 0).Value = "" 'set the activecell to blank
            Debug.Print i
            ActiveCell.Offset(i + 1, 0).EntireRow.Insert shift:=xlDown, copyorigin:=xlFormatFromLeftOrAbove 'insert a new row and shift everything down

            ActiveCell.Offset(i + 1, 0).Value = splitter(0) 'initialize the "Down" cells
            ActiveCell.Offset(i + 1, 0).Value = Replace(ActiveCell.Offset(i + 1, 0).Value, "!@#", " / ")
            For j = 1 To UBound(splitter)
                ActiveCell.Offset(i + j + 1).EntireRow.Insert shift:=xlDown, copyorigin:=xlFormatFromLeftOrAbove 'create another row if it needs to
                ActiveCell.Offset(i + (j + 1), 0).Value = ActiveCell.Offset(i + j).Value & "/" & splitter(j) 'fill out the new row
                ActiveCell.Offset(i + (j + 1), 0).Value = Replace(ActiveCell.Offset(i + (j + 1), 0).Value, "!@#", " / ")
            Next
            i = i + UBound(splitter) + 1 'need to step I past the new cells
            ReDim splitter(0)
            Erase splitter 'erase and eliminate splitter to avoid carry over.

        End If
    Next

End Sub

这就是我想出来的。请务必更改工作表名称以适合您的工作簿。另请务必更改输入范围以适合您自己的单元格输入范围。

Function SplitAndWrite(inputCell As Range, TopOfOutputRange As Range, sep As String) As Range

Dim texts() As String, i As Integer, outputText As String
texts = Split(inputCell.Value, sep)
outputText = ""
TopOfOutputRange = ""   'your blank line
For i = LBound(texts) To UBound(texts)
    outputText = outputText & sep & texts(i)
    TopOfOutputRange.Offset(i + 1) = outputText
Next i

Set SplitAndWrite = TopOfOutputRange.Offset(UBound(texts) + 1)

End Function

Sub THEPOPULATOR()

    Dim s3 As Worksheet, s4 As Worksheet
    Set s3 = Sheets("Sheet1")
    Set s4 = Sheets("Sheet2")
    Dim inputrange As Range, c As Range, outputrange As Range
    Set outputrange = s4.Range("A1")
    Set inputrange = s3.Range(s3.Cells(2, 1), s3.Cells(2, 1).End(xlDown)) 'cells(2,1) = "A1". change this to your top input cell. then the second half will find the bottom cell on its own. This is the same as pressing Ctrl+down

    For Each c In inputrange
        s3.Range(c.Offset(0, 1), c.Offset(0, c.End(xlToRight).Column)).Copy outputrange.Offset(1, 1)
        Set outputrange = SplitAndWrite(c, outputrange.Offset(1), "/")
    Next c

End Sub
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Excel/VBA 细分字段 的相关文章

  • 根据关键列合并多个 Excel 工作簿

    我从不同的客户那里收到七个工作簿 xlsx 文件 每个工作簿都有一张工作表 每张工作表至少有一个公共 ID 列 UNIQ PK 其中一本工作簿包含所有可能的 id 列表 其他人可能没有所有 id 的记录 但每一行都定义了 id 值 我需要制
  • 如何连接以逗号分隔的命名范围的返回值

    我花了几个小时试图找出如何连接命名范围中的返回值 但结果是 运行时错误 32 类型不匹配 作为一个新手 我仍在与数组作斗争 所以也许我忽略了一些细节 谢谢你帮助我 示例 B1 苯 B2 柴油 B3 混合动力 gt E1 汽油 E2 柴油 E
  • VBA Excel 选择以字符开头的命名范围

    我在命名范围方面遇到了一些问题 我在不同的工作表上有多个命名范围 我想用VBA隐藏或显示所有这些范围 命名范围的示例 r1 name1 另一张纸上的第二个是r1 name2 因此 所有范围都以前面相同的代码开头 r1 我如何循环遍历以 r1
  • 从新的 xlsx 文件中删除宏

    功能部分 下面的代码将 xlsm 文件中的 2 个选项卡保存到新的 xlsx 文件中 文件保持打开状态以进行编辑 错误 xlsm 选项卡在工作表代码中有触发器 该触发器无效 一旦在 xlsx 工作表中输入任何内容 就会导致错误 所需输出 编
  • Excel VBA - 将一行单元格值传递到数组,然后将该数组粘贴到单元格的相对引用

    使用 Excel 2010 VBA 我尝试将恒定范围的单元格 其值重新计算 复制 传递 到数组 然后我尝试将该数组传递到其正下方的新单元格范围 完成此操作后 我想再次将常量范围的新值复制 传递 到数组 并将这些新值传递到我之前传递的值正下方
  • 使用 UnmanagedExports 包 [DllExport] 在 VBA 中调用 C# DLL 触发“找不到 DLL 入口点”错误

    我在用着罗伯特 吉塞克 http stackoverflow com users 35443 robert giesecke用于访问 Excel VBA 中的 c dll 的非托管导出包 我遵循了几个示例并继续收到运行时错误 453 在 m
  • 从单元格复制时省略引号

    Problem 当从程序外部的 Excel 复制单元格时 会自动添加双引号 Details 我在 Windows 7 计算机上使用 Excel 2007 如果我有一个具有以下公式的单元格 1 CHAR 9 SOME NOTES FOR LI
  • 如何使用 VBA 忽略范围内的绿色三角形错误,而不逐个单元循环?

    我有一些正在自动化和分发的大型数据集 我想消除警告用户有关存储为文本的数字的绿色小三角形 我使用了以下代码 但在大量纸张上速度非常慢 Range Cells 1 1 Cells lastrow lColumn Select kill tho
  • 如何创建动态变量名VBA

    我正在尝试根据单元格中的值在 VBA 中创建动态数量的变量 本质上我想要的结果是这样的Team1 Team2 to TeamX 任何帮助是极大的赞赏 Dim i x As Integer Set x Range J4 Value Dim T
  • VBA 从文本文件的属性获取日期

    我正在尝试获取特定文本文件上传到计算机的日期 该日期不在实际的文本文件中 您必须右键单击然后转到属性才能查看日期 我需要将日期读入变量 我不知道从哪里开始尝试完成这件事 谢谢你 杰西 斯莫瑟蒙 如果内置FileDateTime 不是你可以使
  • 转置 CopyFromRecordset Excel VBA

    我的 Excel VBA 中有以下代码 可将 SQL 中的表中的数据复制到 Excel 中 该数据从单元格 C2 开始水平插入 但我希望将其垂直插入到 C 列 Sheets Control Range C2 CopyFromRecorset
  • 如何将32位VBA代码转换为64位VBA代码

    我正在尝试运行宏代码 但由于我使用的是 64 位 Excel 2016 因此该代码不起作用 请帮我解决这个问题 Private Declare Function FindWindowEx Lib User32 Alias FindWindo
  • 如何使用Python更改Excel中的列格式

    我想使用 openpyxl 方法将一张纸上的特定行和列复制到另一张纸上 但我的主要 Excel 文件是 xlsb 文件 而 openpyxl 不支持 xlsb 文件 所以我构建了这种复杂的方式 根据公司规则 我无法从 Microsoft E
  • Excel countif 单元格中的日期大于或等于另一个单元格中的日期

    这已经让我难受有一段时间了 我只需要计算一个单元格中的日期是否大于或等于另一个单元格中的日期 减去 x 天 例如 A1 2014 年 2 月 20 日 B1 2014年1月20日 COUNTIF B1 gt A1 30 30 就是负 30
  • 在 XSSF 工作簿上设置密码保护

    我想为使用 poi 3 14 创建的 xlsx 文件添加密码保护 该文档声称 这是可能的 http poi apache org cryption html http poi apache org encryption html 使用我尝试
  • 如何在 VB.NET 中将 DataGridView 导出为 Excel 格式

    我使用 OLE 通过 VB NET 连接到数据库 并在 DataGridView 中显示结果 我想将 DataGridView 中的数据导出到 Excel 格式文件 即用户可以将 DataGridView 的内容保存为 MS Excel 文
  • 如何使用 Excel 公式将一个工作表中的单元格范围引用到另一个工作表?

    我有一个包含工作表 Sheet1 和 Sheet2 的工作表 我试图引用从 Sheet2 到 Sheet1 的一系列单元格 我知道如何引用工作表单元格 例如 Sheet2 A1但我怎样才能对单元格范围做同样的事情 例如A1 F1我试过 Sh
  • Excel VBA 检查工作簿是否打开,如果没有打开则打开

    我在下面放置的代码无法正常工作 尝试运行宏时出现错误 400 您能稍微回顾一下这段代码吗 我不确定问题是否不在于我所指的函数变量 Sub AutoFinal Dim final wb As Workbook shop stat wb As
  • 将参数传递给使用“New”创建的访问表单

    我有一个名为 详细信息 的表单 它显示所选记录的详细视图 该记录是从称为 搜索 的不同形式中选择的 因为我希望能够打开 详细信息 的多个实例 每个实例显示不同记录的详细信息 所以我使用了以下代码 Public detailCollectio
  • Pandas - 分割大的Excel文件

    我有一个大约有 500 000 行的 Excel 文件 我想将其拆分为多个 Excel 文件 每个文件有 50 000 行 我想用熊猫来做 这样它会是最快和最简单的 有什么想法如何制作吗 感谢您的帮助 假设您的 Excel 文件只有一个 第

随机推荐

  • python 正则表达式仅匹配最后一次出现

    我在为重复字符串模式实现正则表达式时遇到一些问题 gt gt gt re findall w d a b c d e f e f 我也想购买其他物品 非常感谢帮助 去除 你的模式匹配all出现次数 但该组只能捕获一次出现情况 您不能以这种方
  • 无法在自定义 SurfaceView 类之上进行绘制

    我用过示例指南创建一个名为 CameraPreview 的类 该类继承自 SurfaceView 类 并显示相机预览 我还创建了另一个名为 DrawOnTop 的自定义视图类 它直接从 View 继承 我用它来在预览顶部绘制文本和其他项目
  • 将可调用线程设为守护进程

    如何将 Callable 线程设置为守护线程 这就是我正在尝试的 我正在尝试执行一组线程 其中一个线程未完成并进入无限循环 它的作用是即使所有代码语句都被执行 程序的主线程也不会终止 之后主线程进入挂起模式 这是相同的代码片段 public
  • 使用 Swift 以编程方式在 Mapkit 中倾斜地图

    我想在启动时倾斜地图 与用户用两根手指向上或向下滚动时的操作相同 使用 Swift 可以做到这一点吗 MKMapView 类参考 http goo gl djHXPn 看着那 这camera财产 相机对象定义了地图表面上方的一个点 可以从该
  • 读取 Json 序列化 c#

    我正在尝试从这个 json 文本中获取 id 我不知道如何获取它不允许我创建 json 对象 我尝试反序列化它这样做 public async Task
  • C++ 内存映射文件实现

    我在实现内存映射文件时没有任何问题 问题是 假设这返回一个有效的内存视图 void pBuf MapViewOfFile hMapFile FILE MAP WRITE 0 0 0 除了使用 memcpy 向其提供数据之外 我还有其他选择吗
  • 将表达式转换为数据类型 int 以进行基本统计时发生算术溢出错误

    我正在尝试执行一个计算平均值 最小值 最大值和计数的基本查询 SELECT MIN column as min MAX column as max AVG column as avg count as count FROM database
  • 如何在startup.cs的Configure方法中使用ConfigurationBinder

    ASP NET MVC 6 beta5 我尝试使用 config json 来激活 非活动日志记录 public IConfiguration Configuration get set public Startup IHostingEnv
  • 在Python中递归地展平嵌套列表[重复]

    这个问题在这里已经有答案了 我正在尝试使用 Python 中的生成器 并尝试利用实现展平函数的简单递归方案 也就是说 一个函数将可能包含子列表的列表作为输入 并输出仅迭代输入的原子元素的可迭代对象 So print list flatten
  • 可以从 WCF 与 Windows 服务进行通信

    我有点新windows services 我有WCF service在一台机器 机器1 上运行 Windows服务在另一台机器 机器2 上运行 我需要我需要运行一个powershell使用 WCF 服务在计算机 2 上编写脚本 我不知道从哪
  • 我可以将 32 位 DLL 加载到 Windows 上的 64 位进程中吗?

    我最近升级了一个 C Windows 服务以作为 64 位 net 进程运行 通常 这很简单 但系统使用了用 C 编写的 32 位 DLL 无法将此 DLL 转换为 64 位 因此我将 DLL 包装在单独的 32 位 net 进程中 并通过
  • 异步任务超时

    我有这段代码来发出异步 HTTP 请求 public static void MakeRequest Uri uri Action
  • Joomla插件:如何获取文章标题和文章id

    我在 Joomla 1 6 中开发了简单的插件 我坚持 如何获取文章标题和文章网址 如果尝试打印以下语句 我不会得到任何输出 echo article gt title echo article gt id 我把这个写在php文件中 没有使
  • Pi Zero W 连接到两个外设(GPIO 和 USB):如何同时连续读取两个外设?

    我有一个 raspberry pizero W 它通过 GPIO 引脚连接到流量计 并通过 USB 连接到条形码扫描仪 我有一个 python 脚本 它使用回调函数在检测到 GPIO 输入时发出警报 该 python 脚本需要在 pizer
  • 提交表单后 jQuery 页面重定向

    我有这样的表格
  • 让 foo(衍生对象) 调用 foo(Base const&) 而不是模板函数?

    鉴于此代码 template lt class C gt void foo C const o o nosuch struct Base void foo Base const struct Derived Base auto main g
  • 通过ajax提交多个表单

    我试图通过 ajax post 提交多个表单 但问题是服务器在 post 中返回一个空数组 这是我的JS中的代码 check test click function e e preventDefault e stopPropagation
  • 在多用户访问环境中立即“锁定”一条记录

    因此 Access 中的记录锁定非常糟糕 我无法使用内置记录锁定 因为它锁定记录的 页面 而不仅仅是单个记录 我已尝试更改使用记录级锁定的设置 但它仍然锁定页面而不仅仅是锁定一条记录 但即使我可以让它工作 它也无法解决我的问题 因为在用户开
  • 首先,反思动态类型以判断它是否是动态类型

    有没有一种方法可以判断对象分配的类型是否是动态类型 例如 dynamic foo GetCat Console WriteLine foo is Cat ToString will print True because at the exe
  • Excel/VBA 细分字段

    我必须完成一项复杂的任务 但我会尝试解释 我有一个包含 23000 行数据的 Excel 文件 我正在将其导入到网站中 每个都有一个像这样的字段 Category other data other data 2 Foods Dog Trea