查找和放置元素在一个长的string/文本列

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

因此,我可以通过某种方式将PDF转换为工作簿并运行分析(通过复制粘贴或另存为IE)我需要从这个长长的粘性物体(目前在9000行,添加到摘录中)获取信息。 。

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

然后它扫描项目(在写这个代码项目之前手动添加 – 例如图片2,“供应1”和相应的信息,可以帮助指示供应1,即发票#,描述,date切割和如此)。

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

一旦find该string,就会将其分割成一个数组,然后寻求将其放置在工作表中的该行右侧的相应单元格中。

问题: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

编辑:通过聊天大厅,bdpolinsky讨论后,我发现什么是抛出原来的错误400(这实际上是错误1004)。

我们修复的第一个问题是InStr()Split()函数引用了Cell对象,而不是其中的string。 通过简单地添加Cells().Text需要string的Cells().Text

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

以下是从原来的答案:

1)在代码的开始处(第一个可执行文件行),您可以按F8逐个执行代码1行,直到标记错误。

您也可以使用error handling程序来捕获错误,并使excel执行与默认不同的操作。 error handling

 Sub SomeCode() Dim i As Integer On Error GoTo ErrHandler i = 1/0 ErrHandler: MsgBox "Error Description: " & Err.Description End Sub 

您也可以单击一行代码来添加一个中断。 打破看起来像红色的圆圈,并为红色的代码行。 您的代码到达此行时将停止。

在这里输入图像说明

2) If Len(cellThatYoureChecking) > 20 Then Code

要么

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

或者访问这个post来定义一个字符在一个函数中有多less次。 然后,您可以根据发生的次数制作您的If语句。

3)这部分对于StackOverflow来说是不好的forms,但是你所要求的只是一点点的参与,所以看看这个教程对你是否有用。 将表格从PDF导入到Excel 。

4)简短的回答是肯定的。 有很多方法来重新组织Excel中的数据。 这个问题有点过于宽泛,在超越自我之前先回答问题1-3会更有效率。