2012-12-29 59 views
0

我是VBA的新手,但我很迷戀!我已經創建了一個工作簿,用於跟蹤每個工作表兩個星期塊的加班時間,每個工作表包含一個2周塊。我試圖調試的宏旨在將工作表中所做的任何更改轉換爲以下工作表。訣竅是,一行中的數據可能在以下工作表中的不同行中,所以我嘗試在宏中使用VLookup以保持其準確性。在宏中使用VLookup

Sub CarryForward() 
    Dim Answer As String 
    Answer = MsgBox("This should only be used for a PERMANENT crew change." & vbNewLine & "If you are adding a new person to the list," & vbNewLine & "please use the Re-Sort function." & vbNewLine & "Do you want to continue?", vbExclamation + vbYesNo, "Caution!") 
    If Answer = vbNo Then 
     Exit Sub 
    End If 
    Application.ScreenUpdating = False 
    Dim ActiveWorksheet As String 
    ActiveWorksheet = ActiveSheet.Name 
     For i = (ActiveSheet.Index + 1) To Sheets("DATA").Index - 1 
      For x = 5 To 25 
       Dim a As String 
       Dim b As String 
       a = "B" & x 
       b = "C" & x 
       ActiveSheet.Range(b).Value = Application.WorksheetFunction.VLookup(a, Sheets(ActiveWorksheet).Range("B5:C25"), 2, False) 
      Next x 
      Range("A3").Select 
     Next i 
    Sheets(ActiveWorksheet).Select 
    Application.CutCopyMode = False 
    Range("A3").Select 
    Application.ScreenUpdating = True 
End Sub 

我很確定這只是VLookup代碼行中的語法錯誤。發佈的很多幫助都接近我所尋找的內容,但它並沒有讓我超越終點。

任何幫助,將不勝感激!

+1

這會更容易,如果我們看到了您的文件準則,您需要什麼,或至少一個截圖。 – brettdj

+1

對於上述評論+1,我也想補充說,VBA是偉大的,但過度它是不好的。我不確定你需要VBA來跟蹤加班,除非你有特別的需求。 – ApplePie

+0

這是契約性的。涉及一個員工工會。 – user1935623

回答

1

這是一個有點不清楚你正在嘗試做的,但字裏行間,我認爲

  • 要查找的a命名包含在單元格的值?
  • 並把結果放在圖表索引i

此外,還有很多機會來提高你的代碼:見下文

Sub CarryForward() 
    Dim Answer As VbMsgBoxResult ' <-- Correct Datatype 
    Answer = MsgBox("This should only be used for a PERMANENT crew change." & vbNewLine & _ 
     "If you are adding a new person to the list," & vbNewLine & _ 
     "please use the Re-Sort function." & vbNewLine & _ 
     "Do you want to continue?", _ 
     vbExclamation + vbYesNo, "Caution!") 
    If Answer = vbNo Then 
     Exit Sub 
    End If 
    Application.ScreenUpdating = False 
    ' Dim ActiveWorksheet As String <-- Don't need this 
    'ActiveWorksheet = ActiveSheet.Name <-- use object variables 
    Dim wbActive As Workbook ' <-- don't select, use variables for sheet objects 
    Dim shActive As Worksheet 
    Set wbActive = ActiveWorkbook 
    Set shActive = ActiveSheet 
    'Dim a As String ' <-- no point in putting these inside the loop in VBA. And don't need these anyway 
    'Dim b As String 
    Dim SearchRange As Range 
    Set SearchRange = shActive.Range("B5:C25") ' <-- Use variable to hold range 
    Dim shDest As Worksheet 
    Dim i As Long, x As Long '<-- dim all your variables 
    For i = (shActive.Index + 1) To wbActive.Worksheets("DATA").Index - 1 ' <-- qualify references 
     Set shDest = wbActive.Sheets(i) 
     For x = 5 To 25 
      'a = "B" & x <-- no need to create cell names 
      'b = "C" & x 
      ' I think you want to lookup the value contained in cell named by a? 
      ' and put the result on sheet index i? 
      ' Note: if value is not found, this will return N/A. Add an error handler 
      wbActive.Sheets(i).Cells(x, 3).Value = Application.VLookup(shActive.Cells(x, 2).Value, SearchRange, 2, False) 
     Next x 
     'Range("A3").Select 
    Next i 
    'Sheets(ActiveWorksheet).Select ,-- don't need these 
    'Application.CutCopyMode = False 
    'Range("A3").Select 
    Application.ScreenUpdating = True 
End Sub 
+0

謝謝!它像一個魅力一樣工作!我特別感謝關於清理代碼的提示。學習如何以及何時爲對象使用變量等也將有助於未來的需求。 – user1935623

+0

我有一個後續問題: – user1935623

+0

的用途後續問題:變量shDest的目的是什麼? – user1935623

1

嵌入的意見,我懷疑你會想更換VLOOKUP語句是這樣的

Application.WorksheetFunction.VLookup(ActiveWorksheet.Range(a).value, ActiveWorksheet.Range("B5:C25"), 2, False) 

目前,它看起來像你只是對一些字符串B5,B6,B7等進行查找而不是這些單元格中的值

+0

謝謝!它像一個魅力一樣工作!我特別感謝關於清理代碼的提示。 – user1935623