2012-04-03 37 views
1

我有一個用VBA編寫的Excel VBA腳本,在編碼方面我不是新手,但對於我來說Excel VBA已經一個由MS出售的糖丸包裹的砷噩夢,作爲一種容易學習的語言。如何使用VBA在Excel中移動單元格後的代碼

好的,咆哮道歉,但我離題了。

下面是完整的腳本:

Option Explicit 

Sub tgr() 

    Dim wsB As Worksheet 'BackOrder 
    Dim wsJ As Worksheet 'Jobs List 
    Dim wsA As Worksheet 'Archive 
    Dim LastRow As Long 

    Set wsB = Sheets("BackOrder") 
    Set wsJ = Sheets("Jobs List") 
    Set wsA = Sheets("Archive") 

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

    With Intersect(wsJ.UsedRange, wsJ.Columns("N")) 
     .AutoFilter 1, "<>Same" 
     With Intersect(.Offset(2).EntireRow, .Parent.Range("B:L")) 
      .Copy wsA.Cells(Rows.Count, "B").End(xlUp).Offset(1) 
      .EntireRow.Delete 
     End With 
     .AutoFilter 
    End With 

    LastRow = wsB.Range("B6").End(xlDown).Row 
    wsB.Range("P5:Q5").Copy wsB.Range("P6:Q" & LastRow) 
    Calculate 
    wsB.UsedRange.Copy Sheets.Add.Range("A1") 

    With Intersect(ActiveSheet.UsedRange, ActiveSheet.Columns("Q")) 
     .AutoFilter 1, "<>Different" 
     .EntireRow.Delete 
     With .Parent 
      .AutoFilterMode = False 
      Intersect(.UsedRange, .Columns("G")).Cut .Range("F1") 
      Intersect(.UsedRange, .Columns("H")).Cut .Range("G1") 
      Intersect(.UsedRange, .Columns("L")).Cut .Range("H1") 
      Intersect(.UsedRange, .Columns("N")).Cut .Range("I1") 
      Intersect(.UsedRange, .Range("B:J")).Copy wsJ.Cells(Rows.Count, "B").End(xlUp).Offset(1) 
      .Delete 
     End With 
    End With 

    LastRow = wsJ.Cells(Rows.Count, "B").End(xlUp).Row 
    wsJ.Range("M1:T1").Copy 
    wsJ.Range("B3:I" & LastRow).PasteSpecial xlPasteFormats 
    wsJ.Range("U1:W1").Copy wsJ.Range("J3:L" & LastRow) 
    wsJ.Range("X1:Y1").Copy wsJ.Range("M3:N" & LastRow) 

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

End Sub 

正如你可以看到這是一個三頁的劇本,延期交貨,喬布斯列表和歸檔,我需要做的是在存檔。當它在列F中的單元格中查找時,使用TODAY()作爲告訴腳本的其餘部分的方式中的單元格在F列的早期或晚期多少天。

J列顯示較早,K列顯示較晚。

列J的腳本是:

=IF(F3-TODAY()<0,"",F3-TODAY()) 

K欄的腳本是:

=IF(TODAY()-F3<1,"",TODAY()-F3) 

F欄在這種情況下是較大的腳本,它通過導入移動數據,並且具有無格式的一部分。

現在,當我將行帶入存檔時,我希望它是單元格的位置,而不是在任何腳本中都有TODAY(),我希望它顯示它在那裏移動的日期,所以它仍然是今天,而不是今天(),它將有這種格式的日期##/##/##。它會「凍結」J的計數,所以從那一天開始它就會準確無誤,所以我們會知道它是遲到還是早發還是準時發貨。

這是可能的,如果是的話如何?

+0

有我正確地讀你的問題?你是否將公式放在J和K列中,然後每天重新計算?爲什麼不:'.Cells(Row,「J」)。Value = Now()'?這會將單元修復到代碼運行的日期/時間。 – 2012-04-04 08:53:58

+0

但是當你再次打開表單時不會改變嗎?如果NOW()兩週前運行成爲今天,如果表單再次打開,那麼它不會發生嗎? – 2012-04-04 14:50:30

+0

'NOW()'是返回的日期,它是由一個宏其中我的發言作爲存儲的值執行時間的函數。一分鐘前'Now()'返回41003.673287037。 41003 =自1月1日以來的天數= 4月12日4。12 .673287037約爲16:08/24:00。 – 2012-04-04 15:14:16

回答

1

您正在混淆工作表函數和VBA函數。儘管我認爲Word VBA是最糟糕的版本,但您儘快停止了這種咆哮。

用戶界面,我可以去單元格A1並輸入「4apr12」。 Excel將此識別爲日期,將其值存儲爲41003,並將格式設置爲「dd-mmm-yy」,這是與我輸入的格式最接近的標準格式。或者,我可以輸入「41003」,然後轉到格式菜單並選擇或輸入我選擇的日期格式。

還有一種選擇是鍵入「= TODAY()」。 Excel將該值存儲爲「= TODAY()」,但由於等於前導值,因此它會在輸入時將其評估爲表達式,並將該值顯示爲標準日期(格式dd/mm/yy位於英國),並將re - 在打開和保存工作簿時以及通過計算選項通知工作簿時評估表達式。

VBA函數是不同的。即使他們做同樣的事情,他們也經常有不同的名字。與TODAY()最近的等價物是Now()。此函數將當前日期和時間作爲數字返回。整數部分是自1900年1月1日以來的日子;小數部分是(從午夜開始的秒數)/(一天中的秒數)。所以今天中午,Now()會返回「41003.5」。這是一個數字;我可以將其倍數爲2,減去5000或其他。

用VBA,我可以執行:

Range("A1").Value = "4apr12" 

Excel中識別出這就像我已經從用戶界面鍵入它的日期。

或者,我可以執行:

Range("A1").Value = 41003.5 

這只是一個數字,將被存儲和顯示41003.5。

如果我想讓它顯示爲一個日期,我必須執行:

With Range("A1") 
    .Value = 41003.5 
    .NumberFormat = "dd mmm yy" 
End With 

值仍然保存爲41003.5,但我已經告訴Excel作爲4顯示其月12

我可以執行:

Range("A1").Value = "=TODAY()" 

這被視爲就好像我已鍵入從接口這個公式。

但是假設我執行:

​​

NOW()返回當前的日期和時間作爲一個數字。 Excel將它存儲爲一個數字,但將它顯示爲一個日期,因爲我告訴它。它永遠不會重新評估,因爲它是一個簡單的數值而不是涉及函數的表達式。

我希望你這是有道理的,並幫助你讓你的頭腦周圍工作表函數和VBA函數之間的差異。 Excel和VBA就像學習駕駛汽車一樣。你第一次知道你將永遠無法同時完成所有這些不同的事情。然而,一兩個月後,您在檢查鏡子時正在玩踏板,變速桿,車輪和指示器。我不明白爲什麼人們會認爲拍拍你的頭,揉揉你的肚子是件大事。我所能說的只是,薄霧將會清除,Excel和VBA將會有意義。

+0

一個MS產品和VBA不應該在同一個句子在我個人的意見,謝謝你的頭了字,但老實說,我從來沒有想過在Word試圖VBA ......這種想法讓我害怕孤獨。 話雖這麼說,代碼的最後一點聽起來像它應該很好地工作,但我有一個問題,它不是明確的是什麼呢? 在任何情況下,感謝您的幫助,我想類似的東西,但說實話我太害怕搬東西,因爲現在VBA是一個浮躁的情婦,我要扔在北極和想象我從來沒有在看到第一名。 – 2012-04-04 19:01:35

+0

對不起,我不明白「這不是明確的嗎?」順便說一句,我認爲你的代碼使用了一些非常困難的方法。 – 2012-04-04 19:06:38

+0

就像我的代碼一樣,它定義了它的功能。由於我正在使用的文件來實現功能,因此我使用了困難的方法。查看Fishbowl及其出口能力,你會看到我正在與之合作。 – 2012-04-04 19:10:48

相關問題