【问题标题】:Trying to automatically split data in excel with vba尝试使用vba自动拆分excel中的数据
【发布时间】:2011-11-30 17:23:59
【问题描述】:

我完全没有使用 excel vba 编程的经验,除了我编写了一个函数来为几周前在我们的生产线上扫描的条码添加数据戳记,主要是通过反复试验。

无论如何,我现在需要帮助的是库存即将到来,我们拥有的每件商品都有条形码,通常会被扫描到记事本中,然后手动拉入 Excel 并使用“文本到列”。我找到了 excel 拆分功能,希望得到一些帮助,让它与我扫描的条形码一起使用。

数据采用以下格式:11111*A153333*11/30/11 加上回车符,其中 * 是分隔符。我发现的所有示例似乎都没有任何作用。

例如,这是我在“”处拆分时发现的一个,但如果我将其更改为 *,则不会发生任何事情。

Sub splitText()

'splits Text active cell using * char as separator
Dim splitVals As Variant
Dim totalVals As Long

splitVals = Split(ActiveCell.Value, "*")
totalVals = UBound(splitVals)

Range(Cells(ActiveCell.Row, ActiveCell.Column + 1), Cells(ActiveCell.Row, ActiveCell.Column + 1 + totalVals)).Value = splitVals
End Sub

如果有帮助,这将应用于 Sheet1 代码部分。

真的不可能这么复杂吧?

编辑:尝试将 Vlookup 添加到 vba。

正如我在下面的 cmets 中所说,我现在正在努力将 vlookup 集成到其中,但它只是返回 N/A。

这是我根据下面的链接写的子

Public Sub vlook(ByRef codeCell As Range)
Dim result As String
Dim source As Worksheet
Dim destination As Worksheet
Set destination = ActiveWorkbook.Sheets("Inventory")
Set source = ActiveWorkbook.Sheets("Descriptions")

result = [Vlookup(destination!(codeCell.Row, D), source!A2:B1397, 2, FALSE)]
End Sub

我试图在工作表中的 For 循环更改后立即调用它,并且刚刚创建了另一个 for 循环,这/应该是嵌套的 for 循环吗?

【问题讨论】:

  • 我刚刚针对您指定的测试字符串运行了您的代码,它运行良好 - 用拆分值填充了接下来的三个单元格。
  • 你把代码放在哪里了?也许这是我的问题?我将代码放入 sheet1 代码中。当我打开它(Alt+F11)时,我只是将那个小 Sub 粘贴在那里,当我用我的条形码扫描仪扫描时,它除了换行到下一行之外什么都不做。
  • 您需要运行代码(例如,作为宏),或者根据逻辑创建某种工作表函数。
  • 好吧,所以离开 phoog 的评论,我将 sub 更改为 Private Sub Worksheet_Change(ByVal Target as Range) 这不起作用,但如果我选择 Worksheet_SelectionChange() 它在我选择列时起作用.什么鬼。

标签: windows excel vba


【解决方案1】:

只是将代码添加到工作表后面的 VBA 中实际上不会导致它被调用。您需要处理 worksheet_change 事件。以下应该会有所帮助:

Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    Dim cell As Range
    For Each cell In Target.Cells
        If cell.Column = 1 Then SplitText cell
    Next
    Application.EnableEvents = True
End Sub

Public Sub SplitText(ByRef codeCell As Range)

    'splits Text active cell using * char as separator
    Dim splitVals As Variant
    Dim totalVals As Long

    splitVals = Split(codeCell.Value, "*")
    totalVals = UBound(splitVals)

    Range(Cells(codeCell.Row, codeCell.Column), Cells(codeCell.Row, codeCell.Column + totalVals)).Value = splitVals

End Sub

【讨论】:

  • 乔恩,这就像我想要的那样,差不多。是否有任何快速编辑以不将条形码留在第一列?这样 15242*A133401*11/30/13 就变成了 15242,而其余的则延续到下一列?
  • 参见上面的修改代码。 Statis inProgress 用于停止所有循环(当您再次编辑第 1 列时)。
  • 谢谢先生,这样就可以了!
  • 从逻辑上讲,他们现在想要添加一个 Vlookup 描述查找,我可以在一周中的任何一天进行,但它根本不想在启用 vba 的情况下工作。有没有让它工作的诀窍?现在它只返回#N/A,我假设这是因为它正在查找实际条形码而不是精简值。我尝试在这里搜索,确实找到了this,但无法让它与其他功能一起发挥作用。再次感谢
  • 使用静态布尔值停止无限循环更新的另一种方法是在Worksheet_Change 过程的开头添加行Application.EnableEvents = False,然后在最后重新打开事件。
【解决方案2】:

如果您想在输入条形码时自动处理条形码,您需要这样的东西(进入工作表模块)。

Private Sub Worksheet_Change(ByVal Target As Range)

Dim splitVals As Variant
Dim c As Range, val As String

    For Each c In Target.Cells

        If c.Column = 1 Then 'optional: only process barcodes if in ColA
            val = Trim(c.Value)
            If InStr(val, "*") > 0 Then
                splitVals = Split(val, "*")
                c.Offset(0, 1).Resize( _
                   1, (UBound(splitVals) - LBound(splitVals)) + 1 _
                                       ).Value = splitVals
            End If
        End If 'in ColA

    Next c
End Sub

【讨论】:

  • 我觉得ActiveCell.Value的引用需要改成val
猜你喜欢
  • 2021-05-06
  • 2012-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多