2014-10-01 151 views
0

我是VBA的新手,所以遇到了一个问题,试图将某个字符串编号转换为IF验证的值编号。EXCEL VBA - 与excel公式类似的函数值

问题是。我充满了这样的事情列 “A”:

E/B:房屋01

E/B:房屋02

E/B:建筑/新别墅

E/B:建筑/贝拉卡萨

E/B:房屋03

所以,在我的代码,我想这与过去的2号填“B”柱,如果有号码或姓名,如果有ISN “T。

Set Rng = Range("A8:A" & Range("I" & Rows.Count).End(xlUp).Row) 

For Each celula In Rng.SpecialCells(xlCellTypeVisible) 
    Select Case True 
     Case IsNumeric(Right(celula, 2)) = True 
      celula.Offset(0, 1).Value = Right((celula), 3) 
     Case Else 
      celula.Offset(0, 1).Value = Mid(celula, InStr(4, celula, "/") + 1, Len(celula)) 
    End Select 
Next celula 

但是案例是数字(右(celula,2))=真从不是真的。它不捕获最后2个数字。但它的名称和返回“新别墅”和“贝拉卡萨”的作品没问题。我认为问题在于Right(celula,2)从来不是一个数字,即使是一个数字。

我想知道是否有一种方法可以在值中转换“Right(celula,2)”,就像在Excel中的= Value公式一样,以进行验证。 OBS:在尝试这种方式之前,我已经将excel公式应用于这些单元格,并且它能够工作,但是我想尝试这种方式来进行学习。

感谢

+1

只需将您的代码和示例数据复制并粘贴到新的Excel工作表中即可使用。你确定数字后没有空格? 'Debug.Print“<”+ Right(celula,2)+“>”'确保(它应该打印'<01>','<02>'等)。 – ssarabando 2014-10-01 13:33:36

+0

看起来不错。用它来测试它。可能是你没有选择正确的范围。 For Each celula In Selection Select Case True .... – causita 2014-10-01 13:35:14

+0

我在自动过滤器后设置了rgn,这是问题所在。谢谢 – MVAmorim 2014-10-01 14:32:21

回答

1

我觉得for each循环本身工作正常。

然而,这

Set Rng = Range("A8:A" & Range("I" & Rows.Count).End(xlUp).Row)

可能是问题所在。你必须确保你有正确的Range。您可以通过调试来验证:Debug.print Rng.Address

+0

范围没问题,它与名称一起工作。如果范围关闭,它应该什么也不返回。 编辑:我有我的工作表中的其他数据,“我”栏填写,但没有在此使用。 – MVAmorim 2014-10-01 13:32:09

+0

它为“rng.address”打印什么? – 2014-10-01 13:33:53

+0

应该还有其他的东西,它可以像预期的那样在单独的工作表中工作,但只有其他情况在我的主表中工作 – MVAmorim 2014-10-01 13:37:37

0
Sub t() 
Dim rng As Range 

With ActiveSheet 
    Set rng = .Range("a1:a" & .Range("a" & .Rows.Count).End(xlUp).Row) 
     For Each cell In rng.Cells 

      If Val(Right(cell.Value, 2)) = 0 Then 
         cell.Offset(0, 1) = Mid(cell.Value, InStrRev(cell.Value, "/") + 1, Len(cell)) 
        Else 
         cell.Offset(0, 1) = Val(Right(cell.Value, 2)) 
      End If 

     Next cell 
End With  

End Sub