VBA文本到列不parsing所有数据

我有两个.csv文件 – 在他们的眼睛,他们是相同的,但关于他们的一定是不同的。 当第一个数据到达我的文本到列macros的数据时,它仅对部分列(前39)进行跳转,跳过一部分(从40到最后一个右移)。 这不会发生在第二个.csv的数据。

以下是两个数据的示例(它们是从两个不同的数据库生成的):

QRT NAME;REPORTING YEAR /;SOLVENCY CALCULA;LEGAL NAME OF TH;HOME COUNTRY;REPORTING CURREN;PORTFOLIO TYPE;ASSET HELD IN UN;PORTFOLIO;LINE ID;ID CODE;ID CODE TYPE;ID CODE LONG TEX;ORIGINAL CURRENC;ISSUER;ISSUER MIDDLE TE;ISSUER SECTOR;ISSUER COUNTRY;ISSUER CODE;ISSUER GROUP;ISSUER GROUP MID;PARTICIPATION;CUSTODIAN;CUSTODIAN MIDDLE;COUNTRY OF CUSTO;CIC ASSET CATEGO;CIC SUB ASSET CA;ASSETS SUBCLASS;TYPE OF SECURITY;TYPE OF COLLATER;BALANCE SHEET IT;EQUITY TYPE;RATING AGENCY;EXTERNAL RATING;MATURITY DATE;DURATION;VALUATION METHOD;QUANTITY;TOTAL PAR AMOUNT;UNIT SII PRICE;PERCENTAGE OF PA;ACCRUED INTEREST;TOTAL SII AMOUNT;ACQUISITION PRIC;WRITE-OFFS/WRITE;TOTAL AMOUNT LOC;IFRS ACCOUNTING;CLEAN VALUE IN O;DIRTY VALUE IN O;EXPOSURE IN ORIG;EQUITY;PROPERTY;FX RISK (DOWNSID;FX RISK (UPSIDE;INTEREST RATE (D;INTEREST RATE (U;SPREAD RISK BOND;SPREAD RISK STRU;SPREAD RISK DERI;;USE OF DERIVATIV;LONG OR SHORT PO;UNWIND TRIGGER O;TRADE DATE;PREMIUM PAID TO;PREMIUM RECEIVED;SWAP OUTFLOW AMO;SWAP DELIVERED C;SWAP INFLOW AMOU;SWAP RECEIVED CU;TRIGGER VALUE;DELTA;NUMBER OF CONTRA;CONTRACT DIMENSI;NOTIONAL AMOUNT;MAXIMUM LOSS UND;ASSET PLEDGED AS;FUND NUMBER;MATCHING PORTFOL;CURRENT INTEREST;INTEREST RATE FR;REDEMPTION;REFERENCE RATE L;FIXING FACTOR;FIXING SPREAD;QUOTATION TYPE;INTEREST RATE TY;REDEMPTION TYPE;QUOTED;LISTING COUNTRY;ANNUITY/INSTALLM;DISCOUNTING SPRE;FUNDS: FIXED INC;FUNDS: EQUITY QU;FUNDS: PROPERTY;FUNDS: CASH QUOT;FUNDS: ALTERNATI;FUNDS: FX-QUOTA;FUNDS: SPREAD DU;FUNDS: DURATION;BALANCE SHEET IT; S.06.02.01;006.2016;M1;C;PL;PLN;L;N;LF_COMP;1;PLOPNPL00013;ISIN;X SA;PLN;9978;X;G47;PL;2594002C0DGL8KBA5491;18284;X;N;9448;ING BANK SLASKI;PL;3;PL31;EQ-STOCKS;Equity;NA;EQUI-EQUI;TYPE1;;;;;QMP;4900,000000;;31,470000;;0,000000;154203,000000;160424,170000;;;154203,000000;154203,000000;154203,000000;;49098,510000;0,000000;0,000000;0,000000;0,000000;0,000000;0,000000;;;;;;U;;;;;;;;;;;;;;NC;;;;0,00;;0,00;;;Per unit;;;Quoted;PL;;;;;;;;;;;31; S.06.02.01;006.2016;M1;C;PL;PLN;L;N;LF_COMP;3;PL_CLF_PLN_BRE§2510;CAU;TD_PL_CLF_BRE BANK_PLN;PLN;9357;MBANK;K64.1.9;PL;259400DZXF7UJKK2AY35;727;COMMERZBANK;;9357;MBANK;PL;7;XT73;CASH-TD;Deposit;FIN-SEN;CASH-CASH;TYPE2;MDY;BBB;30.12.2016;0,500000;AVM;;448000,000000;;1,000000;4963,960000;452963,960000;;;;448000,000000;448000,000000;452963,960000;;0,000000;0,000000;0,000000;0,000000;-2655,240000;2436,920000;0,000000;;;;;;U;;;;;;;;;;;;;;NC;;;0,02210;0,00;;0,00;;;Percent;;;(none);;;;;;;;;;;;41; QRT NAME;REPORTING YEAR /;SOLVENCY CALCULA;LEGAL NAME OF TH;HOME COUNTRY;REPORTING CURREN;PORTFOLIO TYPE;ASSET HELD IN UN;PORTFOLIO;LINE ID;ID CODE;ID CODE TYPE;ID CODE LONG TEX;ORIGINAL CURRENC;ISSUER;ISSUER MIDDLE TE;ISSUER SECTOR;ISSUER COUNTRY;ISSUER CODE;ISSUER GROUP;ISSUER GROUP MID;PARTICIPATION;CUSTODIAN;CUSTODIAN MIDDLE;COUNTRY OF CUSTO;CIC ASSET CATEGO;CIC SUB ASSET CA;ASSETS SUBCLASS;TYPE OF SECURITY;TYPE OF COLLATER;BALANCE SHEET IT;EQUITY TYPE;RATING AGENCY;EXTERNAL RATING;MATURITY DATE;DURATION;VALUATION METHOD;QUANTITY;TOTAL PAR AMOUNT;UNIT SII PRICE;PERCENTAGE OF PA;ACCRUED INTEREST;TOTAL SII AMOUNT;ACQUISITION PRIC;WRITE-OFFS/WRITE;TOTAL AMOUNT LOC;IFRS ACCOUNTING;CLEAN VALUE IN O;DIRTY VALUE IN O;EXPOSURE IN ORIG;EQUITY;PROPERTY;FX RISK (DOWNSID;FX RISK (UPSIDE;INTEREST RATE (D;INTEREST RATE (U;SPREAD RISK BOND;SPREAD RISK STRU;SPREAD RISK DERI;;USE OF DERIVATIV;LONG OR SHORT PO;UNWIND TRIGGER O;TRADE DATE;PREMIUM PAID TO;PREMIUM RECEIVED;SWAP OUTFLOW AMO;SWAP DELIVERED C;SWAP INFLOW AMOU;SWAP RECEIVED CU;TRIGGER VALUE;DELTA;NUMBER OF CONTRA;CONTRACT DIMENSI;NOTIONAL AMOUNT;MAXIMUM LOSS UND;ASSET PLEDGED AS;FUND NUMBER;MATCHING PORTFOL;CURRENT INTEREST;INTEREST RATE FR;REDEMPTION;REFERENCE RATE L;FIXING FACTOR;FIXING SPREAD;QUOTATION TYPE;INTEREST RATE TY;REDEMPTION TYPE;QUOTED;LISTING COUNTRY;ANNUITY/INSTALLM;DISCOUNTING SPRE;FUNDS: FIXED INC;FUNDS: EQUITY QU;FUNDS: PROPERTY;FUNDS: CASH QUOT;FUNDS: ALTERNATI;FUNDS: FX-QUOTA;FUNDS: SPREAD DU;FUNDS: DURATION;BALANCE SHEET IT; S.06.02.01;006.2016;M1;C;PL;PLN;L;N;LF_COMP;1;PLOPNPL00013;ISIN;X SA;PLN;9978;X;G47;PL;2594002C0DGL8KBA5491;18284;X;N;9448;ING BANK SLASKI;PL;3;PL31;EQ-STOCKS;Equity;NA;EQUI-EQUI;TYPE1;;;;;QMP;4900,000000;;31,470000;;0,000000;154203,000000;160424,170000;;;154203,000000;154203,000000;154203,000000;;49098,510000;0,000000;0,000000;0,000000;0,000000;0,000000;0,000000;;;;;;U;;;;;;;;;;;;;;NC;;;;0,00;;0,00;;;Per unit;;;Quoted;PL;;;;;;;;;;;31; S.06.02.01;006.2016;M1;C;PL;PLN;L;N;LF_COMP;3;PL_CLF_PLN_BRE§2510;CAU;TD_PL_CLF_BRE BANK_PLN;PLN;9357;MBANK;K64.1.9;PL;259400DZXF7UJKK2AY35;727;COMMERZBANK;;9357;MBANK;PL;7;XT73;CASH-TD;Deposit;FIN-SEN;CASH-CASH;TYPE2;MDY;BBB;30.12.2016;0,500000;AVM;;448000,000000;;1,000000;4963,960000;452963,960000;;;;448000,000000;448000,000000;452963,960000;;0,000000;0,000000;0,000000;0,000000;-2655,240000;2436,920000;0,000000;;;;;;U;;;;;;;;;;;;;;NC;;;0,02210;0,00;;0,00;;;Percent;;;(none);;;;;;;;;;;;41; 

以下是我使用的文本到列的公式:

注意:数据是从InputBook复制的,然后文本到列发生在ParamBook中

 Public Sub Load_input() InputPath = Application.GetOpenFilename("Comma Separated Values (*.csv),*.csv") Call Fetch_Data End Sub Sub Fetch_Data() Dim InputBook As Workbook Dim ParamBook As Workbook Dim n As Integer Dim K As Integer Set InputBook = Workbooks.Open(InputPath) Set ParamBook = ThisWorkbook '==========CLEAR CONTENTS OF DATA SHEET========== If ParamBook.Sheets("Data").Cells(1, 1) <> "" Then ParamBook.Sheets("Data").Cells.Clear End If '==========COPY INPUT AND PASTE INTO DATA SHEET========== n = InputBook.Sheets(1).Cells(Rows.Count, "A").End(xlUp).Row InputBook.Activate InputBook.Sheets(1).Range(Cells(1, 1), Cells(n, 1)).Select Selection.Copy ParamBook.Activate Application.DisplayAlerts = False ActiveSheet.Paste Destination:=Worksheets("Data").Range("A1") '==========TEXT TO COLUMSN IN DATA SHEET========== K = ParamBook.Sheets("Data").Cells(Rows.Count, "A").End(xlUp).Row ThisWorkbook.Sheets("Data").Activate For K = 1 To K Application.DisplayAlerts = False ThisWorkbook.Sheets("Data").Cells(K, 1).Select Selection.TextToColumns DataType:=xlDelimited, Semicolon:=True, Comma:=False Next K InputBook.Close End Sub 

如果有什么我可以做的代码,我会很感激一些技巧 ,我宁可不要如何生成.csv文件。

编辑:

这个文本到列的代码只是工作更快,但仍然是相同的问题。

 '==========TEXT TO COLUMSN IN SAP_BW_DATA SHEET========== K = ParamBook.Sheets("SAP BW Data").Cells(Rows.Count, "A").End(xlUp).Row ThisWorkbook.Sheets("SAP BW Data").Activate ThisWorkbook.Sheets("SAP BW Data").Range(Cells(1, 1), Cells(K, 1)).Select Selection.TextToColumns DataType:=xlDelimited, Semicolon:=True, Comma:=False 

编辑2:

好的,我缩小了范围 – 事实certificate,问题不在于TtCfunction,而在于.csv文件粘贴数据的方式。 目前设置的方式只抓取部分数据(文本到列的相同部分),其余部分不被粘贴。 解决这个问题将有助于解决问题。 感谢所有参与帮助的人!

编辑3:

@cxw已经解决了这个问题,请看他的post!

好的 – 让我们再试一次。 当明显的答案失败时,检查您的input。

 Set InputBook = Workbooks.Open(InputPath) 

在默认模式下打开InputPath 。 您称这些“csv”文件,但实际上他们是分号分隔,根据您的macros。 我怀疑这两个文件有不同的扩展名,有问题的是*.csv 。 是?

我刚刚在Excel 2013安装中尝试了这一点。 当我在上面的第一个testing用例的*.csv文件上运行上面的行时,Excel将它分成逗号的列。 因此, InputBook的数据跨越A:S列,所以只有拔出A列的代码才不会获取所有数据。 为了解决这个问题,我使用了

 Set InputBook = Workbooks.Open(InputPath, format:=5) 

格式5是每个文档 “无分隔符”。 当我这样做的时候,我完全在列A获得每一行,而手动的文本到列的工作。

编辑是,扩展名很重要:当我将我的testing文件从.csv重命名为.txt ,没有指定格式的常规Workbooks.Open不会拆分这些列。

编辑看到实际的答案 。

问题可能是这一行:

 For K = 1 To K 

你正在改变循环绑定,这是你想要的:)。 ( 更正见下面的Comintern的注释 。)(如果你想要灵活的界限, Do循环将是一个更好的select。)

 LastRow = ParamBook.Sheets("Data").Cells(Rows.Count, "A").End(xlUp).Row ThisWorkbook.Sheets("Data").Activate ' <--- should this reference ParamBook? Dim CurrentRow as Long Application.DisplayAlerts = False ' move out of the loop for speed For CurrentRow = 1 To LastRow ThisWorkbook.Sheets("Data").Cells(CurrentRow, 1).Select Selection.TextToColumns DataType:=xlDelimited, Semicolon:=True, Comma:=False Next CurrentRow 

而且,您当前的代码引用了三个工作簿: InputBookParamBookThisWorkbook (macros居住的地方)。 编辑我看你已经初始化ParamBook是一个ThisWorkbook的副本。 我build议你始终坚持使用ParamBook ,因为如果以后需要将代码移植到外挂ParamBook中,则可以更容易。