在文本的长字符串/列中查找和放置元素

时间:2016-09-08 18:50:39

标签: excel vba excel-vba excel-2010

以下是从会计系统下载信息的结果。基本上,我的任务是从今年的在线系统中分类费用;一旦从在线系统下载信息,它就没有格式化为电子表格(所以我不能轻易使用简单的查找)。信息是作为电子表格下载的,但它没有包含支票号码或姓名;出于某种原因,excel格式化了那些。剩下的唯一的东西就是长条纹文档,其中下载的PDF中的每个项目(包含校验数字和名称)都放在第1列(见图1),而它应该被放置在格式化如图2的东西中显然,虽然PDF不保持格式化。

因此,我可以将PDF转换为工作簿并进行分析(IE通过复制粘贴或另存为),我需要从这个长串的东西中获取信息(它在9000行处于那一刻,在摘录中加入。)

首先,此代码将工作表设置为工作表,获取pers中的数据长度(图2中的示例),以及费用表中的数据长度(图1中的示例)

然后它会扫描人员的项目(在编写之前,这些代码项是手动添加的 - 例如图2中的情况,'供应1'以及可以帮助表示供应1的相应信息,即发票#,描述,日期切割等)。

对于每个项目,它然后扫描费用表"。它尝试将发票号(在这种情况下最接近唯一ID)与单元格i,1中的值匹配;如果它存在,它然后向上扫描'直到它找到一个足够长的字符串,以便它可以是5个单位字符串;包含日期,支票号,金额和名称,以及批号和备忘录的那个。

一旦找到该字符串,它就会将其拆分为一个数组,然后将其放在工作表pers中该行右侧的相应单元格中。

问题: 1)我一直收到错误400.通常当我收到错误时,VBA会显示什么行。这是什么?如何设置错误捕获块,以便编辑器提供有关错误的更多详细信息(即发生错误,发生原因等) 2)我假设长行(在这种情况下,从顶部开始的第12个)只能通过其长度来识别。有没有更好的方法来识别长行?也许如果它包含多个破折号? 3)有没有人知道如何轻松传输会计打印输出的PDF,以便在保存或复制到电子表格时保留其格式? 4)有没有办法可以通过excel轻松地格式化这个电子表格,以便它可以更充分地适应正确的模具(更像图2)?

Option Explicit

Sub findDetailMemo()

    Dim pers As Worksheet
    Set pers = ThisWorkbook.Sheets("PERS")

    Dim persLength As Long
    persLength = pers.Range("a1").End(xlDown).Row


    Dim expenseLength As Long
    expenseLength = Range("a1").End(xlDown).Row

    Dim currentDetail() As String


    Dim i As Long
    Dim j As Long
    Dim k As Long


    Dim tempInt As Long


'first scan all of the items in the pers unit
        For k = 2 To 10
        'next scan all of the expenses
                For i = 2 To expenseLength
                    'if the invoice # is found
                    If InStr(Cells(i, 1), pers.Range("a1").Offset(k, 3)) <> 0 Then
                        'scan upwards; make sure you don't scan beyond the range of the spreadsheet
                        For j = i To 1 Step -1
                            'if the scan upwards finds a string that is 80 characters or more
                             If Len(Cells(i - j, 1)) >= 80 Then
                                'split it at the -
                                 currentDetail = Split(Cells(i - j, 1), "-", -1, vbTextCompare)
                                 'add it to the pers sheet
                                 pers.Range("a1").Offset(k, 11) = currentDetail(0)
                                 pers.Range("a1").Offset(k, 12) = currentDetail(1)
                                 pers.Range("a1").Offset(k, 13) = currentDetail(2)
                                 pers.Range("a1").Offset(k, 14) = currentDetail(3)
                                 Exit For
                            End If
                        Next j
                     Exit For
                    Else
                    End If
                Next i
        Next k
End Sub

ExpensePrintout

PERS

1 个答案:

答案 0 :(得分:1)

编辑:经过聊天大厅讨论后,bdpolinsky和我发现了原来的错误400(实际上是错误1004)。

我们修复的第一个问题是InStr()Split()函数引用了Cell对象而不是其中的字符串。只需在需要字符串的位置添加Cells().Text即可解决此问题。

If Len(Cells(i - j, 1).Text) >= 80行,我们发现Cells()没有引用正确的工作表。解决此问题的方法是将Cells()定义为pers.Cells(),这是导入信息的工作表。很高兴地报告bdpolinsky所遇到的问题已经解决(就错误而言)。

以下内容来自原始答案:

1)在代码开头(第一个可执行行),您可以按F8一次单步执行代码1行,直到错误被标记。

您还可以使用错误处理程序来捕获错误,并使excel执行与默认值不同的操作。 Error Handling

Sub SomeCode()
    Dim i As Integer

    On Error GoTo ErrHandler
    i = 1/0

ErrHandler:
  MsgBox "Error Description: " & Err.Description
End Sub

您还可以单击一行代码旁边的以添加中断。中断看起来像红色圆圈,并将该行代码的颜色设置为红色。您的代码将在到达此行时停止。

enter image description here

2)If Len(cellThatYoureChecking) > 20 Then Code

或者

If InStr(cellThatYoureChecking, "symbolYouWantToFind") <> 0 Then Code

或者访问this post关于定义字符在具有函数的字符串中的次数。然后,您可以根据发生的次数制作If语句。

3)这部分是StackOverflow的糟糕形式,但你要问的是有点参与,所以看看本教程是否对你有用。 Import table from PDF to Excel

4)对此的简短回答是肯定的。有很多方法可以在Excel中重新组织数据。这个问题虽然有点过于宽泛,但在提出问题之前先回答问题1-3会更有效率。