2014-03-12 45 views
0

我试图将数据矩阵转换为适合特定分析软件的新标准。VBA函数遍历单元格,用相对列标题值替换单元格

初始矩阵如下所示:

real char num 10 10 25 26 26 56 
-------------------------------- 
state num  1 2 9 4 6 3 
-------------------------------- 
name 1  0 0 1 1 0 1 
name 2  1 0 0 0 0 0 
name 3  0 1 1 0 0 1 
name 4  0 1 0 0 1 0 
name 5  1 0 0 0 0 0 
name 6  0 0 1 0 1 0 

我一直在努力实现这一目标:

real char num 10 10 25 26 26 56 
-------------------------------- 
state num  1 2 9 4 6 3 
-------------------------------- 
name 1  0 0 9 4 0 3 
name 2  1 0 0 0 0 0 
name 3  0 2 9 0 0 3 
name 4  0 2 0 0 6 0 
name 5  1 0 0 0 0 0 
name 6  0 0 9 0 6 0 

从本质上讲,我试图做的是:
1。每列,在每个单元格中查找非0的数字;
2.如果达到此条件,请将单元格值替换为相对“状态”标题。意思是,例如,如果A4 <> 0,则将其替换为A3值。

我使用的代码如下:

Sub Iterate_replace() 
    Sheets("matrix").Select 

    Dim r As Range, cell As Range, state As Range 

    Set r = Range("C3") 
    Set state = Range("C2") 

    For Each cell In r 
     If cell.Value <> "0" Then 
      cell.Value = state.Value 
     End If 
    Next 
End Sub 

它工作在规定的一个单列的范围很好,但我无法使其动态。我是否应该使用R1C1表示法来引用范围内的单元格?我能找到的所有相关内容都不会说明如何使这个迭代更加灵活。我应该使用嵌套循环吗?循环对我来说是非常困难的事情,但请耐心等待。

如果有人能指出我正确的方向,我将不胜感激。谢谢!

回答

0

我假设每张纸上都没有其他问题。在这种情况下,你应该能够让你的程序动态修改喜欢你的代码如下:

Sub Iterate_replace() 
    Sheets("matrix").Select 
    Dim i As Integer, j As Integer 
    Dim state As Range 

    Set state = Range("C2") 

    'Loops through each row and each column in matrix 
    For i = state.Column To ActiveSheet.Cells(state.Row, Columns.Count).End(xlToLeft).Column 
     For j = state.Row + 1 To ActiveSheet.Cells(Rows.Count, state.Column).End(xlUp).Row 
      If Cells(j, i).Value <> 0 Then 
       Cells(j, i).Value = Cells(state.Row, i).Value 
      End If 
     Next j 
    Next i 
End Sub 

通过每列在你的矩阵中的每一列。这将循环,如果你在什么细胞中最左边的状态定义值位于。

+0

这太棒了。所以我需要的是嵌套循环和关于如何确定范围的一些知识。非常感谢你,我从你的片段中学到了很多东西(是的,你的假设是正确的)。 – arbolitoloco