2013-01-01 25 views
2

考慮下面的矩陣:是否可以找到每個excel行的最後一個元素距離?

Col1 Col2 Col3 Col4 Col5 Col6 Col7 
R1 x  x      x 
R2   x    x    x 
R3             x 
R4   x  x  x 
R5         x 

現在使用VBScript或ADO爲準纔有可能找到每一行的最後一個元素的距離是多少? 距離的定義距離只不過是最後一個元素放置在給定矩陣中之後的單元數的計數。用於例如說 -

  • DIST(R1)= 5

  • DIST(R4)= 4像明智

我嘗試了以下:

Option Explicit 

Dim ArrayListTaskDetails : Set ArrayListTaskDetails = CreateObject("System.Collections.ArrayList") 
Dim i,colcount 

i=2 
Do while i < = objExcel1.Application.WorksheetFunction.CountA(ob.Rows(1)) 

colcount=objExcel1.Application.WorksheetFunction.CountA(ob.Rows(i)) 
ArrayListTaskDetails.Add(colcount) 

i=i+1 
Loop 

ArrayListTaskDetails.Sort() 
i=ArrayListTaskDetails.Count 
MsgBox("HighestColumnNumner:" & ArrayListTaskDetails(i-1)) 

但它不起作用,因爲不能處理兩個空白之間的內容。

Thnaks,

+0

@SiddharthRout請參閱我的描述,但它不工作! – CodeLover

+0

當然:)現在看你的代碼... –

+0

我有一個vba以及公式解決方案...讓我完全測試它。在此期間,你可能想看到Ekkehard.Horner解決方案:) –

回答

2

另一種方式......在VBScript中使用公式

Dim oXLApp, oXLWb, oXLWs 

Set oXLApp = CreateObject("Excel.Application") 

'~~> Show Excel 
oXLApp.Visible = True 

'~~> Open files (Change as applicable) 
Set oXLWb = oXLApp.Workbooks.Open("C:\MyFile.xlsx") 
Set oXLWs = oXLWb.Sheets(1) 

Dim lRow, i, tmp 

With oXLWs 
    lRow = .Range("A" & .Rows.Count).End(-4162).Row 

    For i = 2 To lRow 
     tmp = oXLApp.Evaluate("=ADDRESS(ROW(A" & i & "),MATCH(INDEX($" & i _ 
     & ":$" & i & ",MAX(IF($A" & i & ":$K" & i & "<>"""",COLUMN($A" & i _ 
     & ":$K" & i & ")))),A" & i & ":K" & i & "),1)") 

     MsgBox .Range("A" & i).Value & " :- " & .Range(tmp).Column - 1 
    Next 
End With 

截圖

enter image description here

跟進

按要求

Dim oXLApp, oXLWb, oXLWs 

Set oXLApp = CreateObject("Excel.Application") 

'~~> Hide Excel 
oXLApp.Visible = True 

'~~> Open files 
Set oXLWb = oXLApp.Workbooks.Open("C:\MyFile.xlsx") 
Set oXLWs = oXLWb.Sheets(1) 

Dim lRow, i, tmp, MyArray, ColNo, ReturnName 

With oXLWs 
    lRow = .Range("A" & .Rows.Count).End(-4162).Row 

    ColNo = .Columns.Count 

    ReturnName = Split(.Cells(, ColNo).Address, "$", -1,1)(1) 

    For i = 2 To lRow 
     tmp = oXLApp.Evaluate("=ADDRESS(ROW(A" & i & "),MATCH(INDEX($" & i _ 
     & ":$" & i & ",MAX(IF($A" & i & ":$" & ReturnName & i & _ 
     "<>"""",COLUMN($A" & i & ":$" & ReturnName & i & ")))),A" & _ 
     i & ":" & ReturnName & i & "),1)") 

     msgbox .Range("A" & i).Value & " :- " & .Range(tmp).Column - 1 
    Next 
End With 

更多跟進

Option Explicit 

Dim oXLApp, oXLWb, oXLWs 
Dim lRow, i, tmp, MyArray, ColNo, ReturnName 

Set oXLApp = CreateObject("Excel.Application") 

'~~> Hide Excel 
oXLApp.Visible = True 

'~~> Open files 
Set oXLWb = oXLApp.Workbooks.Open("C:\MyFile.xlsx") 

'~~> Set the Sheet 1 as sheet1 
Set oXLWs = oXLWb.Sheets(1) 

With oXLWs 
    '~~> Get the last row in the worksheet 
    lRow = .Cells.Find("*", .Range("A1"), -4123, 2, 1, 2).Row 

    '~~> Get the total col count 
    ColNo = .Columns.Count 

    '~~> This will return the column name from column number 
    ReturnName = Split(.Cells(, ColNo).Address, "$", -1, 1)(1) 

    For i = 1 To lRow 
     '~~> We are using the Evaluate to calculate the formula 
     '~~> which will find our result 
     tmp = oXLApp.Evaluate("=ADDRESS(ROW(A" & i & "),MATCH(INDEX($" & i _ 
     & ":$" & i & ",MAX(IF($A" & i & ":$" & ReturnName & i & _ 
     "<>"""",COLUMN($A" & i & ":$" & ReturnName & i & ")))),A" & _ 
     i & ":" & ReturnName & i & "),1)") 

     '~~> This will return the column number 
     MsgBox "Last Col in Row " & i & " is " & .Range(tmp).Column 
    Next 
End With 
+0

這裏的一個問題是它如何用於'n'列數量? – CodeLover

+1

我把它拿到「K」。你可以擴展到你的要求是 –

+0

你能評論哪些是我需要chaange以適合我的一個部分嗎? – CodeLover

2

給定一個ADODB連接到一個.xls,一個

"SELECT * FROM [Sheet2$]" 

表示

PID  T1  T2  T3  T4  T5 
11  1  <Null> 1  1  <Null> 
14  1  1  1  <Null> 1 
21  <Null> <Null> 1  <Null> <Null> 
88  1  1  1  <Null> <Null> 
99  1  <Null> <Null> <Null> <Null> 
100  <Null> <Null> <Null> <Null> <Null> 
101  1  1  1  1  1 

嵌套IIF(ISNULL(COL),[...] ,ColNum)in

"SELECT PID, IIF(IsNull(T5),IIF(IsNull(T4),IIF(IsNull(T3),IIF(IsNull(T2),IIF(IsNull(T1),0,1),2),3),4),5) As RMCol FROM [Sheet2$]" 

wi會導致

PID  RMCol 
11  4 
14  5 
21  3 
88  3 
99  1 
100  0 
101  5 

試圖解釋:

IIF(BoolExpression, TrueValue, FalseValue)的表達式求TrueValue如果BoolExpression爲True,以FalseValue否則;因此將另一個IIF置於IsNull(Colx)的True槽中將連續測試列,直到非空列將觸發FalseValue(列號)的返回。

是的:SQL是一個處理任意數量的行(固定/精心設計的一組列)的工具;所以如果你設計錯誤的時候把一組邏輯不受限制的信息放入列中 - 而不是(另一張)表 - 那就是你付出的代價。

更新:

我毫不猶豫地提起這事,因爲所有的黑客和快捷方式,從長遠來看會失敗 - 而不是你還是要把你從一個體面的設計,從頭開始,但是:

一個遞歸功能:

Function genIFF(n) 
    If 1 = n Then 
    genIFF = "IIF(IsNull(T1),0,1)" 
    Else 
    genIFF = "IIF(IsNull(T" & n & ")," & genIFF(n - 1) & "," & n & ")" 
    End If 
End Function 

會很樂意創建:

Dim n 
    For n = 1 To 5 
     WScript.Echo n, genIFF(n) 
    Next 

1 IIF(IsNull(T1),0,1) 
2 IIF(IsNull(T2),IIF(IsNull(T1),0,1),2) 
3 IIF(IsNull(T3),IIF(IsNull(T2),IIF(IsNull(T1),0,1),2),3) 
4 IIF(IsNull(T4),IIF(IsNull(T3),IIF(IsNull(T2),IIF(IsNull(T1),0,1),2),3),4) 
5 IIF(IsNull(T5),IIF(IsNull(T4),IIF(IsNull(T3),IIF(IsNull(T2),IIF(IsNull(T1),0,1),2),3),4),5) 

甚至:

50 IIF(IsNull(T50),IIF(IsNull(T49),IIF(IsNull(T48),IIF(IsNull(T47),IIF(IsNull(T46),IIF(IsNull(T45),IIF(IsNull(
T44),IIF(IsNull(T43),IIF(IsNull(T42),IIF(IsNull(T41),IIF(IsNull(T40),IIF(IsNull(T39),IIF(IsNull(T38),IIF(IsNul 
l(T37),IIF(IsNull(T36),IIF(IsNull(T35),IIF(IsNull(T34),IIF(IsNull(T33),IIF(IsNull(T32),IIF(IsNull(T31),IIF(IsN 
ull(T30),IIF(IsNull(T29),IIF(IsNull(T28),IIF(IsNull(T27),IIF(IsNull(T26),IIF(IsNull(T25),IIF(IsNull(T24),IIF(I 
sNull(T23),IIF(IsNull(T22),IIF(IsNull(T21),IIF(IsNull(T20),IIF(IsNull(T19),IIF(IsNull(T18),IIF(IsNull(T17),IIF 
(IsNull(T16),IIF(IsNull(T15),IIF(IsNull(T14),IIF(IsNull(T13),IIF(IsNull(T12),IIF(IsNull(T11),IIF(IsNull(T10),I 
IF(IsNull(T9),IIF(IsNull(T8),IIF(IsNull(T7),IIF(IsNull(T6),IIF(IsNull(T5),IIF(IsNull(T4),IIF(IsNull(T3),IIF(Is 
Null(T2),IIF(IsNull(T1),0,1),2),3),4),5),6),7),8),9),10),11),12),13),14),15),16),17),18),19),20),21),22),23),2 
4),25),26),27),28),29),30),31),32),33),34),35),36),37),38),39),40),41),42),43),44),45),46),47),48),49),50) 

視覺校對,並從什麼ñExcel將窒息的nesteds綜合投資框架的測試留作練習受虐狂。

+0

無法理解的邏輯,你能解釋它嗎? – CodeLover

+0

如果我有50列,那麼我是否需要以這種嵌套的方式編寫所有內容? – CodeLover

+0

對不起,你100%正確!那麼是否有可能使嵌套條件變得簡單或一般化? – CodeLover

相關問題