2013-04-25 80 views
1

我试图修改我的代码以允许在运行循环时考虑更多因素。这是我到目前为止,这是一个循环运行i = 2至605(因为在2和605之间,我的G列的值始终是相同的“马卡蒂市”)。
enter image description here
对于这个循环,我定义了一些动作,它运行良好。这里是在什么我的循环正在做相关代码:Excel - 只要单元格的内容等于特定值,VBA:循环

For i = 2 To lRowBldg 
Range("B" & i).Activate 

'try to find a match btwn active cell and one of the elements from parsed address 
    For Each cell In elementsListRange.Cells 
     If Match(ActiveCell.Value, cell.Value) Then 
     Range("K" & i).Value = Range("K" & i).Value + 13 
     Else 
     Range("K" & i).Value = Range("K" & i).Value + 0 
     End If 
     If Match(ActiveCell.Offset(0, 4).Value, cell.Value) Then 
     Range("K" & i).Value = Range("K" & i).Value + 8 
     Else 
     Range("K" & i).Value = Range("K" & i).Value + 0 
     End If 
    Next 

Next i 

但是,当我打算进行一些修改这个文件,我需要重新考虑我的代码。到目前为止,我只有一个城市的这个文件,所以基本上我可以从第一个值到最后一个值循环,并且没问题。现在,我计划增加更多城市:例如从2到605(马卡蒂市),从606到900(布拉巴拉市),从901到...等等。

我尝试做的是这样的:
环,只要G中列的单元格的值等于XXXXX(可能是马卡蒂市,可能是布拉布拉市,等等)
如果我提到马卡蒂市,它会循环i = 2到605,如果它是blabla City,那么它会循环i = 606到900,依此类推。

对于如何以不会太耗费资源的方式进行此操作,您有什么想法吗?因为我的文件可能会变得很长?

非常感谢!

+2

最快的解决办法是增加你的循环内的附加'if'声明,右下方为'each'行......这可能就像'如果Cells(cell.row,“G”)=“blabla City”then'... – 2013-04-25 07:02:07

+0

谢谢@KazJaw,但是通过这样做,我保持了“For i = 2 to lRowBldg”,这不再有意义,就好像我正在搜索blabla City一样,“我”应该从606开始,然后在900停止吧?我希望循环仅适用于相关的行,如果我的文件有10000行,我希望它循环几百个只适合的行,以保持操作的快速。 – Phalanx 2013-04-25 07:08:55

+2

正如我所说的那样,实施起来最快......无论如何,您需要找到您的城市名称的第一行。你可以使用'.Range.Find'对象/属性,或者你可以使用'match + index'函数,就像[在这个问题中](http://superuser.com/questions/586764/how-to-implement-match - 和 - 索引功能在一起,在Excel中 - VBA)(不回答) – 2013-04-25 07:14:59

回答

1

使用一段时间? 下面是一些想法....

Sub Test() 
     dim rng as range 
     rng = worksheet.find 

     While rng.Value2 LIKE "Makhati City" 
     'your logic here 
     rng.offset(row+1,col+0 or like this) 
     Wend 
    End Sub 
+0

感谢您的建议,我会尝试这一点。尽管如何识别“活动细胞”,我有点困惑。在我的逻辑中,我指的是使用这种写法的每个单元格:“Range(”K“&i).Value”,因为循环使用可以清楚地知道光标在哪里。如果我使用类似于你的建议,是否仍然可以在第一条消息中识别我的代码中的活动行? – Phalanx 2013-04-25 07:44:04

+0

我建议你模拟一个for循环:Declare在while循环之外是可变的,并在“wend”之前增加它。 然后将此变量提供给rng.offset方法 - 它会给你一个指向活动单元格的范围。 – 2013-04-25 08:39:29

+2

此方法在技术上不依赖于“ActiveCell” - 如果在该循环内添加了一个调试语句“Debug.Print ActiveCell.Address”,则该地址不会**改变 - 但它不会改变不需要,因为这种方法特别指的是没有“激活”它的细胞。这种方法实际上更加高效,尽可能不依赖于'Selection'或'ActiveCell/Workbook/Sheet'! – 2013-04-25 13:29:59

1

你可以试试这个,用的筒子1 & N,和避免循环完全

把所有的代码标准模块中,然后修改在setColumnKValues代码来搜索列differenct cioy名G.

假设:

  • 那differencet城市将被组合在一起
  • ,你可以用一对额外的列(在这种主体L & N)作为中间体
  • ,你会打电话给setFormulasColumnK在对城市的秩序
  • 根据您的问题中的代码,如果满足条件,您希望向列K添加一个数字。

它是如何工作: 首先,在N列,我们把表示在城市化 然后,在L列我们把公式中,如果匹配标记值的城市传递,那么L = K + 13 最后,我们复制粘贴在K列新的价值观,并清晰的筒子1 &ň

Private oLastRange As Range 
Private iFirstCell As Integer 
Private iLastCell As Integer 
Private lLastRow As Long 

Sub setFormulasColumnK(ByVal sCity As String) 

Dim sFormula As String 
Dim oRange As Range 

lLastRow = Cells(Rows.Count, Range("G1").Column).End(xlUp).Row 

Range("N4:N" & lLastRow).Formula = "=IF(G4<>G5,NA(),"""")" 

If Not Range("G:G").Find(sCity) Is Nothing Then 
    iFirstCell = Range("G:G").Find(sCity).Row 
Else 
    Exit Sub 
End If 

Set oRange = Range("N" & iFirstCell) 

iLastCell = Range("N" & iFirstCell & ":N" & lLastRow).Find("#N/A", oRange).Row 

Range("L" & iFirstCell & ":L" & iLastCell).Formula = "=IF(TRIM(G:G)=""" & sCity & """,K:K+13,0)" 
Set oLastRange = Range("L" & iLastCell) 

End Sub 

Sub setColumnKValues() 

    Set oLastRange = Nothing 

    Call setFormulasColumnK("Makati City") 
    'MsgBox oLastRange.Address 
    Call setFormulasColumnK("London") 
    'MsgBox oLastRange.Address 
    Call setFormulasColumnK("Birmingham") 
    'MsgBox oLastRange.Address 
    Call setFormulasColumnK("Moscow") 
    'MsgBox oLastRange.Address 
    Call setFormulasColumnK("Luxembourg") 
    'MsgBox oLastRange.Address 
    Call setFormulasColumnK("Paris") 
    'MsgBox oLastRange.Address 

    Range("L4" & ":L" & lLastRow).Copy 
    Range("K4" & ":K" & lLastRow).PasteSpecial xlPasteValues 
    Range("N4:N" & lLastRow).Clear 
    Range("L4" & ":L" & lLastRow).Clear 

End Sub