如何使Excel电子表格范围存储VBAvariables?

好,所以我花了..我只是说…像一个小时(可悲的是我说谎,它像一整个星期)试图弄清楚这一点。 而我无法弄清楚godd * mnit> _ <

假设我们在记事本中有一个文本文件( _A_File_.txt ),只包含4行:

 ACCOUNT NUMBER: 123456789 '(line 2) SHORT NAME: JON SMITH '(line 2) ACCOUNT NUMBER: 987654321 '(line 3) SHORT NAME: BOB BARKER '(line 4) 

我们假设在Excel电子表格中,下面是:

 Range C1 = "actNumberTrim" Range C2 = "shortNameTrim" Range C3 = "actNumberTrim" Range C4 = "shortNameTrim" 

让我们也假设下面的VBA脚本:

 Sub obey_me_you_stoopit_code_() Dim actNumber As Integer Dim shortName As Integer Dim actNumberTrim As String Dim shortNameTrim As String Dim trimArray1 As Variant Dim myFile As String Dim text As String Dim textline As String actNumber = InStr(text, "ACCOUNT NUMBER: ") 'THERE IS A SPACE BETWEEN : AND " shortName = InStr(text, "SHORT NAME: ") 'THERE IS A SPACE BETWEEN : AND " actNumberTrim = Mid(text, actNumber + 16, 10) shortNameTrim = Mid(text, shortName + 12, 10) myFile = "C:\Users\Bob\Desktop\_A_File_.txt" Open myFile For Input As #1 Do Until EOF(1) Line Input #1, textline text = text & textline Loop trimArray1 = ThisWorkbook.Worksheets("sheet1").Range("C1:C4") For i = 1 To UBound(trimArray1) MsgBox trimArray1(i, 1) Next i Close #1 End Sub 

我得到的输出是:

 [ actNumberTrim ] [ shortNameTrim ] [ actNumberTrim ] [ shortNameTrim ] 

我将如何去解决上述问题,使得范围C1:C4中的值被视为:

  1. variables而不是,说在一个单元格中毫无意义的文本
  2. 所以返回的输出是:

     [ 123456789 ] [ JON SMITH ] [ 987654321 ] [ BOB BARKER ] 

我试着改变了actNumberTrimshortNameTrim的数据types。 它没有工作我得到的是这样的:

运行时错误:“你的代码糟透了”

思考?

编辑1 (尝试使用Microsoft脚本运行时)

  Dim trimArray1 As Variant Dim myFile1 As String Dim text As String Dim textline As String Dim myDict As New Dictionary myFile1 = "C:\Users\BOB\Desktop\_A_File_.txt" Open myFile1 For Input As #1 Do Until EOF(1) Line Input #1, textline text = text & textline Loop Close #1 trimArray1 = ThisWorkbook.Worksheets("sheet22").Range("C1:C4") v = Split(textline, ":") 'where v has been declared to be variant myDict.Add Trim(v(0)), Trim(v(1)) For i = 1 To UBound(trimArray1) MsgBox myDict(trimArray1(i, 1)) Next i [ BLANK ] [ BOB BARKER ] [ BLANK ] [ BOB BARKER ] 

单元格C1:C4包含:

  ACCOUNT NUMBER SHORT NAME ACCOUNT NUMBER SHORT NAME 

不知道我做错了什么,或者我忽略了什么。 我如何使用这种方法的领域没有“:”分离它们? 我发布的文本文件的版本有点过于简化了。 反馈?

编辑2下面是我原来的做法

以下是示例文本文件中的两个完整logging的示例:

  ACCOUNT ABCDEF12 CUSTOMER NAME: JOHN B. SMITH CSA REP: 154983 ACCOUNT OPEN: 05/10/15 CUSTOMER ADDRESS: 123 SOMEWHERE DRIVE SOMETHING HERE: LAST ORDER: 06/24/2011 COUNTRY CODE: UNITED STATES INVOICE #: 123456789 STATE CODE: CALIFORNIA LAST MAINTENANCE: 01/02/15 COUNTY CODE: UNCODED SOME INDICATOR: NO COMPLAINTS: NO IPM IND: DATAPREP/PERF4 SOME INDICATOR: NO STATUS: NONE AUTO RENEW: YES SOMETHING HERE NO SOMETHING HERE: ABC IND: SOMETHING HERE 2 ABC ASSET NO: T ACCOUNT ABCDEF12 CUSTOMER NAME: JOHN B. SMITH CSA REP: 154983 ACCOUNT OPEN: 05/10/15 CUSTOMER ADDRESS: 123 SOMEWHERE DRIVE SOMETHING HERE: LAST ORDER: 06/24/2011 COUNTRY CODE: UNITED STATES INVOICE #: 123456789 STATE CODE: CALIFORNIA LAST MAINTENANCE: 01/02/15 COUNTY CODE: UNCODED SOME INDICATOR: NO COMPLAINTS: NO IPM IND: DATAPREP/PERF4 SOME INDICATOR: NO STATUS: NONE AUTO RENEW: YES SOMETHING HERE: NO SOMETHING HERE: ABC IND: SOMETHING HERE: 2 ABC ASSET NO: T 

以下是我最初编码的方式:

 ' Dim myFile As String Dim text As String Dim textline As String Dim cstAct as integer Dim actOpe as integer Dim cusNam as integer Dim act as integer Dim reg as integer myFile = "put file patch to text file here" myFile = Application.GetOpenFilename() Do Until EOF(1) Line Input #1, textline text = text & textline Loop cusAct = InStr(text, "ACCOUNT ") actOpe = InStr(text, "ACCOUNT OPEN:") reg = InStr(text, "REGION:") cusNam = InStr(text, "CUSTOMER NAME:") For i = 2 To ThisWorkbook.Worksheets("b2").Range("a65536").End(xlUp).Row ThisWorkbook.Worksheets("name").Range("a" & i).Value = Mid(text, act + 6, 9) ThisWorkbook.Worksheets("name").Range("b" & i).Value = Mid(text, cstAct + 6, 9) ThisWorkbook.Worksheets("name").Range("c" & i).Value = Mid(text, actOpe + 13, 27) ThisWorkbook.Worksheets("name").Range("d" & i).Value = Mid(text, cusNam + 20, 19) next i 'Format and autofit For x = 2 To ThisWorkbook.Worksheets("b2").Range("a65536").End(xlUp).Row Range("a" & x).Value = Application.WorksheetFunction.Clean(trim(Range("a" & x))) Range("b" & x).Value = Application.WorksheetFunction.Clean(trim(Range("b" & x))) Range("c" & x).Value = Application.WorksheetFunction.Clean(trim(Range("c" & x))) 'etc etc next x 

你可以使用string作为字典的 (它的行为类似于链接到相应值的variables)。 在Tools / References下的VBA编辑器中,包含对Microsoft Scripting Runtime的引用。 然后在你的代码的顶部有一行

 Dim myDict As New Dictionary 

然后,当你通过文件循环,并通过连续的行加载variablestextline行,不要粘到一个大的variables的末尾,而是有行

 v = Split(textline, ":") 'where v has been declared to be variant myDict.Add Trim(v(0)), Trim(v(1)) 

修复C列中的单元格,使其与冒号前文本文件中的实际(修剪)string重合。 无需消除空格 – "Account Number"是一个完全有效的单元格值和完全有效的字典键。 稍后,当循环显示从列C中绘制的值时,请replace

 MsgBox trimArray1(i, 1) 

通过

 MsgBox myDict(trimArray1(i, 1)) 

这应该(如果我正确理解你的意图)做你想做的事情。