2012-12-11 115 views
0

假设我有一个数组= {A,B,Y,X}。我现在具有可以具有列和Rows.Say的动态数如下面的例子的Excel工作表:使用vbscript创建稀疏矩阵

输入:

ColA ColB ColC .... 

T  P  Y .... 
C  Y  D .... 
B  A  M .... 
Z  R  X .... 

输出:

ColA ColB ColC .... 

-  -  Y .... 
-  Y  - .... 
B  A  - .... 
-  -  X .... 

如果所有列只有数组值,如果找到其他值,则它们是需要通过替换为“ - ”

有没有更快的过程中做这些使用VBScript除了速度比较慢循环技术?

感谢,

+0

你写过代码,它是慢?我预计它会很快。 –

+0

是的,我使用循环技术。这是我粘贴在这里的一个特殊的快照。实际工作表有3500行和250列,这使得它更慢。所以我想知道任何最快的过程。 –

+0

你可以发布你使用的代码吗? –

回答

1
Sub Macro1() 

    Dim arr, i, rng As Range 

    arr = Array("X", "Y", "Z") 
    Set rng = ActiveSheet.Range("A1").CurrentRegion 

    With Application 
     .ScreenUpdating = False 
     .Calculation = xlCalculationManual 
    End With 

    For i = LBound(arr) To UBound(arr) 
     rng.Replace What:=arr(i), Replacement:="-", LookAt:=xlWhole, _ 
      SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _ 
      ReplaceFormat:=False 
    Next i 

    With Application 
     .ScreenUpdating = True 
     .Calculation = xlCalculationAutomatic 
    End With 

End Sub 

编辑:

Sub KeepValues() 

    Dim arr, arrVals, i, rng As Range, r, c 
    Dim keepval As Boolean 

    arr = Array("X", "Y", "Z") 

    Set rng = ActiveSheet.Range("A1").CurrentRegion 
    arrVals = rng.Value 

    For r = 1 To UBound(arrVals, 1) 
     For c = 1 To UBound(arrVals, 2) 
      keepval = False 
      For i = LBound(arr) To UBound(arr) 
       If arr(i) = arrVals(r, c) Then 
        keepval = True 
        Exit For 
       End If 
      Next i 
      If Not keepval Then arrVals(r, c) = "" 
     Next c 
    Next r 

    rng.Value = arrVals 

End Sub 
+0

感谢蒂姆你的更新,但我正在寻找一个相同的VBscript代码。 –

+0

我认为你的宏将用“ - ”替换矩阵中的数组元素。我对吗?如果我是正确的,那么想说你想让你实现相反的目标。所有的元素都需要用“ - ”替代,除了数组元素。 –

+0

对不起 - 误读了这个问题.... –