2014-06-19 36 views
1

下面是一些非常简单的代码,它使用字符串填充单元格,并在打印过程中打印到状态栏以给用户一些反馈。无论如何,我可以更快地做到这一点吗?加速使用字符串填充单元格的代码

类似screenupdating的内容已被禁用。

我的想法是将字符串发送到数组,然后填充数组中的单元格,但我不确定将完成此任务的代码。

让我知道我能做什么!

Sub SheetNames() 

    DoEvents 
    Application.StatusBar = "Populating array (0)" 
    Range("O1") = "ASRS" 
    Range("O2") = "Base Coat Line" 
    Range("O3") = "Base Coat Line 2" 
    Range("O4") = "Body Shop Feed" 
    Range("O5") = "Cavity Wax Manual" 
    Application.StatusBar = "Populating array (5)" 
    Range("O6") = "Cavity Wax Masking" 
    Range("O7") = "Cavity Wax Oven" 
    Range("O8") = "Cavity Wax Robots" 
    Range("O9") = "Clear Coat Line 1" 
    Range("O10") = "Clear Coat Line 2" 
    Application.StatusBar = "Populating array (10)" 
    Range("O11") = "Control Room Robots" 
    Range("O12") = "Crane 1" 
    Range("O13") = "Crane 2" 
    Range("O14") = "Crane 3" 
    Range("O15") = "Crane 4" 
    Application.StatusBar = "Populating array (15)" 
    Range("O16") = "Crane 5" 
    Range("O17") = "Crane 6" 
    Range("O18") = "De-Mask" 
    Range("O19") = "Delivery From Assembly" 
    Range("O20") = "Delivery To Assembly" 
    Application.StatusBar = "Populating array (20)" 
    Range("O21") = "E-Coat" 
    Range("O22") = "E-Coat Dip Process" 
    Range("O23") = "E-Coat Oven" 
    Range("O24") = "E-Coat Sand Strip Out" 
    Range("O25") = "E-Coat Sand Strip Out Buffer" 
    Application.StatusBar = "Populating array (25)" 
    Range("O26") = "Final Inspection" 
    Range("O27") = "Interior Sealer 2A" 
    Range("O28") = "Interior Sealer 2B" 
    Range("O29") = "Interior Sealer Manual" 
    Range("O30") = "Interior Sealer Robots" 
    Application.StatusBar = "Populating array (30)" 
    Range("O31") = "Manual Work Decks" 
    Range("O32") = "Mix Room" 
    Range("O33") = "Phosphate" 
    Range("O34") = "Phosphate Process" 
    Range("O35") = "Polish Line" 
    Application.StatusBar = "Populating array (35)" 
    Range("O36") = "Pre-Trim" 
    Range("O37") = "Prim Booth" 
    Range("O38") = "Prim Color Sort Buffer" 
    Range("O39") = "Prime Oven" 
    Range("O40") = "Prime Oven & PSO" 
    Application.StatusBar = "Populating array (40)" 
    DoEvents 
    Range("O41") = "Primer Automation" 
    Range("O42") = "Primer Prep" 
    Range("O43") = "Primer Tackoff" 
    Range("O44") = "RTO 1" 
    Range("O45") = "RTO 2" 
    Application.StatusBar = "Populating array (45)" 
    Range("O46") = "RTO 3" 
    Range("O47") = "Sealer Oven" 
    Range("O48") = "Sealer Prep" 
    Range("O49") = "Sealer Strip Out" 
    Range("O50") = "Skid Wash" 
    Application.StatusBar = "Populating array (50)" 
    Range("O51") = "Spot Repair Conveyor" 
    Range("O52") = "Topcoat Blower/Feather" 
    Range("O53") = "Topcoat Booth 1" 
    Range("O54") = "Topcoat Booth 2" 
    Range("O55") = "Topcoat Prep" 
    Application.StatusBar = "Populating array (55)" 
    Range("O56") = "Topcoat Strip Out" 
    Range("O57") = "UBS" 
    Range("O58") = "UBS Manual" 
    Range("O59") = "UBS Robots" 
    Range("O60") = "VIN Scribe Robot" 
    Application.StatusBar = "Populating array (60)" 
    Range("O61") = "Waste Water Process" 
    Application.StatusBar = "Array populated." 

End Sub 

以下是几个结合的答案,哪些作品,而且更快!

Sub FillRangeFromArray() 
Dim S As Variant 
Dim i As Long 

S = Array("ASRS", "Base Coat Line", "Base Coat Line 2", "Body Shop Feed", "Cavity Wax Manual", _ 
"Cavity Wax Masking", "Cavity Wax Oven", "Cavity Wax Robots", "Clear Coat Line 1", "Clear Coat Line 2", _ 
"Control Room Robots", "Crane 1", "Crane 2", "Crane 3", "Crane 4", "Crane 5", "Crane 6", "De-Mask", _ 
"Delivery From Assembly", "Delivery To Assembly", "E-Coat", "E-Coat Dip Process", "E-Coat Oven", _ 
"E-Coat Sand Strip Out", "E-Coat Sand Strip Out Buffer", "Final Inspection", "Interior Sealer 2A", _ 
"Interior Sealer 2B", "Interior Sealer Manual", "Interior Sealer Robots", "Manual Work Decks", "Mix Room", _ 
"Phosphate", "Phosphate Process", "Polish Line", "Pre-Trim", "Prim Booth", "Prim Color Sort Buffer", "Prime Oven", _ 
"Prime Oven & PSO", "Primer Automation", "Primer Prep", "Primer Tackoff", "RTO 1", "RTO 2", "RTO 3", _ 
"Sealer Oven", "Sealer Prep", "Sealer Strip Out", "Skid Wash", "Spot Repair Conveyor", _ 
"Topcoat Blower/Feather", "Topcoat Booth 1", "Topcoat Booth 2", "Topcoat Prep", "Topcoat Strip Out", _ 
"UBS", "UBS Manual", "UBS Robots", "VIN Scribe Robot", "Waste Water Process") 

Range("O1").Resize(UBound(S) + 1, 1).Value = Application.Transpose(S)  
End Sub 
+0

我找不到这些提示的SO回答,但从这里开始:http://www.ozgrid.com/VBA/SpeedingUpVBACode.htm –

+0

[Here](http://stackoverflow.com/questions/19371139/how-do-i-fill-a-2-dimensional-array-with-values-and-then-put-the-results-into-a)有一个类似问题的答案,但我的数组只会是一个维度。 – tannman357

+0

为什么硬编码所有这些值?创建一个工作表,将值存储在那里,并将其复制/粘贴到1行代码中。这将需要0时间来运行,并且更容易更新和维护。想一想,如果他们想出了“添加起重机7选项并删除最终检查”的要求,那将会很烦人,需要一些打字。如果你在一张纸上有一个范围,更新就变得微不足道了。 – sous2817

回答

4

您可以一次性添加值:

Dim arr 
arr = Array("one", "Two", "Three") 
Range("a1").Resize(UBound(arr) + 1, 1).Value = Application.Transpose(arr) 
+0

虽然这比我的回答更简单,但我仍不明白这是如何“加速”将60根琴弦放在一列中......这和我的答案完全一样,几乎是瞬间的。尽管如此,为进一步简化做得很好。我的个人偏好是给数组中的位赋值,所以我很容易看到'S(12)'是“起重机1”。用这种方法,你需要计算数组中的字符串。如果你想在其他地方引用一个字符串,你不知道需要使用什么'S'号码而不计算。这就是为什么我不使用“数组”功能 – SilverShotBee

+1

如果你真的想,用这个编辑你的答案而不是循环,我会选择你的答案。就像你已经指出的那样,我的机器很慢。我注意到非常微妙的编码差异,特别是在速度方面。这个解决方案比循环快10倍。 – tannman357

+0

我只是想明白为什么会这样(因为这个网站都是关于扩大你的知识!)。所以如果有人可以解释为什么这会对有限的机器产生影响,我会感激它 – SilverShotBee

1
Sub SheetNames() 

Dim S(61) As String 


    DoEvents 
    S(1) = "ASRS" 
    S(2) = "Base Coat Line" 
    S(3) = "Base Coat Line 2" 
    S(4) = "Body Shop Feed" 
    S(5) = "Cavity Wax Manual" 
    S(6) = "Cavity Wax Masking" 
    S(7) = "Cavity Wax Oven" 
    S(8) = "Cavity Wax Robots" 
    S(9) = "Clear Coat Line 1" 
    S(10) = "Clear Coat Line 2" 
    S(11) = "Control Room Robots" 
    S(12) = "Crane 1" 
    S(13) = "Crane 2" 
    S(14) = "Crane 3" 
    S(15) = "Crane 4" 
    S(16) = "Crane 5" 
    S(17) = "Crane 6" 
    S(18) = "De-Mask" 
    S(19) = "Delivery From Assembly" 
    S(20) = "Delivery To Assembly" 
    S(21) = "E-Coat" 
    S(22) = "E-Coat Dip Process" 
    S(23) = "E-Coat Oven" 
    S(24) = "E-Coat Sand Strip Out" 
    S(25) = "E-Coat Sand Strip Out Buffer" 
    S(26) = "Final Inspection" 
    S(27) = "Interior Sealer 2A" 
    S(28) = "Interior Sealer 2B" 
    S(29) = "Interior Sealer Manual" 
    S(30) = "Interior Sealer Robots" 
    S(31) = "Manual Work Decks" 
    S(32) = "Mix Room" 
    S(33) = "Phosphate" 
    S(34) = "Phosphate Process" 
    S(35) = "Polish Line" 
    S(36) = "Pre-Trim" 
    S(37) = "Prim Booth" 
    S(38) = "Prim Color Sort Buffer" 
    S(39) = "Prime Oven" 
    S(40) = "Prime Oven & PSO" 
    S(41) = "Primer Automation" 
    S(42) = "Primer Prep" 
    S(43) = "Primer Tackoff" 
    S(44) = "RTO 1" 
    S(45) = "RTO 2" 
    S(46) = "RTO 3" 
    S(47) = "Sealer Oven" 
    S(48) = "Sealer Prep" 
    S(49) = "Sealer Strip Out" 
    S(50) = "Skid Wash" 
    S(51) = "Spot Repair Conveyor" 
    S(52) = "Topcoat Blower/Feather" 
    S(53) = "Topcoat Booth 1" 
    S(54) = "Topcoat Booth 2" 
    S(55) = "Topcoat Prep" 
    S(56) = "Topcoat Strip Out" 
    S(57) = "UBS" 
    S(58) = "UBS Manual" 
    S(59) = "UBS Robots" 
    S(60) = "VIN Scribe Robot" 
    S(61) = "Waste Water Process" 

For i = 1 To 61 

Range("O" & i) = S(i) 

Application.StatusBar = "Populating array (" & i & ")" 

Next i 

end sub 
+0

是否有可能一次完成,列出它们?而不是每一行?谢谢! – tannman357

+1

您可以声明像Dim S As Variant这样的阵列,然后声明阵列(“ASRS”,“Base Coat Line”,“Base Coat Line 2”)等等。但是当我在我的回答中呈现时,它更容易可视化和添加。这个数组也会以'0'开始,所以每个'S'使用'i' wint都不需要'i-1'发生。 – SilverShotBee

+0

正确。我已经做到了,并将我的答案放在下面。但事实是,它并没有让它变得更快。 – tannman357

2

我知道答案已被接受,但我认为这是一种更为灵活的答案。在希望标题的工作簿中,创建名为“列表”的工作表。在新的List工作表的A列中,放入以A2开始的标题,然后往下走,但他们需要做的事情(可以随意放入类似于A1中的“HeaderList”)......这也假设你想要数据复制到Sheet1(您需要根据自己的情况进行更改)。

Sub HeaderMover() 
    Dim lr As Long 

    lr = Sheets("Lists").Range("A65536").End(xlUp).Row 

    Sheets("Lists").Range("A2:A" & lr).Copy 
    Sheet1.Range("A1").PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, Transpose:=True 

End Sub 

因此,当您需要更改数据时,有关代码和使用辅助工具表的好处就出现了。实际上,您不必更改“列表”选项卡上的列表列以外的任何内容。代码不需要改变。

你可以做一些额外的检查最后一行和东西,但我的代码是为了指导。

+0

这正是我在VBA中做的列表,因为它使得它们更灵活,即使它们在不同的工作簿中 – SilverShotBee