2016-01-13 95 views
0

我一直在使用這個論壇的次數可以算,這是我第一次在這裏問一個問題,目前我的工作讓我使用excel和excel vba,甚至爲早餐,所以即使認爲我遠遠沒有被稱爲專業人士,我在我的時間做了各種基本的項目。excel vba變量不加載單元格的值

這個問題是推動我瘋了,甚至絕望的地步,只是不明白爲什麼,不知道如何突出在問題發生*部分*

Function WAGESPERHOUR(TSHOUR As Date, TEHOUR As Date, _ 
    Optional TDAY, Optional TWEEK) 

Dim tableWages(10000) As dataSchedule 
Dim nSheet As String, inRow As Integer, inCol As Integer, _ 
weekCol As Integer, dayCol As Integer, dateCol As Integer, _ 
sShiftCol As Integer, eShiftCol As Integer, hoursWCol As Integer, _ 
wageTCol As Integer, itemsCount As Integer, n As Integer 

Application.Volatile 

Erase tableWages 
WAGESPERHOUR = 0 
nSheet = "input schedule" 
inRow = 5 
inCol = 1 
weekCol = 2 
dayCol = 1 
dateCol = 3 
sShiftCol = 6 
eShiftCol = 7 
hoursWCol = 10 
wageCol = 11 
itemsCount = 0 

For n = 0 To 9999 
    If Sheets(nSheet).Cells(inRow + n, dateCol) = "" Then 
     itemsCount = n - 1 
     Exit For 
    End If 
    tableWages(n).day = Sheets(nSheet).Cells(inRow + n, dayCol) 
    *****tableWages(n).week = Sheets(nSheet).Cells(inRow + n, weekCol)***** 
    tableWages(n).startShift = Sheets(nSheet).Cells(inRow + n, sShiftCol) 
    tableWages(n).endShift = Sheets(nSheet).Cells(inRow + n, eShiftCol) 
    tableWages(n).hoursWorked = Sheets(nSheet).Cells(inRow + n, hoursWCol) 
    tableWages(n).wage = (Sheets(nSheet).Cells(inRow + n, wageCol)/2) 

Next 

For n = 0 To itemsCount 
    If TDAY = "" Then 
     tableWages(n).day = TDAY 
    End If 
    If TWEEK = "" Then 
     tableWages(n).week = TWEEK 
    End If 
    If ((tableWages(n).startShift >= sHOUR And tableWages(n).startShift < eHOUR) _ 
    Or (tableWages(n).endShift > sHOUR And tableWages(n).endShift < sHOUR) _ 
    Or (eHOUR > tableWages(n).startShift And eHOUR < tableWages(n).endShift) _ 
    Or (sHOUR >= tableWages(n).startShift And sHOUR < tableWages(n).endShift)) _ 
    And tableWages(n).day = TDAY _ 
    And tableWages(n).week = TWEEK Then 
     WAGESPERHOUR = WAGESPERHOUR + tableWages(n).wage 
    End If 
Next 

End Function 

的tableWages (n).week應該從單元格獲得「第1周」(n,2);但它沒有;我使用檢查和單元格值是正確的,但是什麼時候分配它保留的值(「」);最糟糕的部分是它以前工作過,我把書重新打開並停止工作。

enter image description here 我還附加了一個打印屏幕,檢查員顯示該單元格確實有「第1周」,但由於某種原因,它無法保存在數組中。其他每個變量都有效。

感謝它需要獲得價值細胞的幫助

編輯 打印屏幕。 enter image description here

+0

定義dataSchedule對象的代碼在哪裏?我不認爲它是Excel VBA對象模型的一部分,所以我假設你有一個Class模塊或類似的模塊。問題可能在於如何定義Get和Let程序。 –

+0

嗨比你非常多,對於響應,我總是定義類型的這種方式,更容易讓我在程序/功能 –

+0

類型dataSchedule 日作爲字符串 周作爲字符串 日截止日 staffName作爲字符串 以後使用staffRole作爲字符串 startShift截止日期 endShift截止日期 hoursWorked爲雙 工資爲雙 結束類型 –

回答

0

我不明白其中的道理,但不知何故,在tableWages(n).week = Sheets(nSheet).Cells(inRow + n, weekCol)線,範圍對象不返回Value財產,因爲它應該。

我可以通過返回Text屬性來獲得該行的工作。然後將適當的一週返回給數組。但我不明白爲什麼。

tableWages(n).week = Sheets(nSheet).Cells(inRow + n, weekCol).Text 

我沒有時間今晚進一步研究這個,但上述變化似乎消除你與week 1未填充的問題。

有趣的是,我認爲,是觀察窗口的這個屏幕截圖任務的第一個循環之後採取tableWages(0)

enter image description here

它表明,沒有返回值,即使雖然Text屬性是周1

編輯/添加: 進一步的調查表明,在input schedule工作在Table腐敗。

您的問題的另一個修復程序,不涉及涉及更改代碼,將重做Week列的公式。

input schedule

  • 選擇B6:B100
  • 刪除
  • 選擇B5在式酒吧
  • 將光標在所述式的端
  • Enter
  • 由於這是一個表格,B5中的公式將被填充到B500。
  • 宏現在工作填寫.week它應該。

這裏的一個問題也解釋了爲什麼直到最近這不是一個問題。公式可能在該列的某處發生了變化,並且沒有適當地傳播到整個列。

+0

是啊!感謝你解決這個問題讓我意識到我後來在代碼中有另一個,錯誤的變量名現在工作非常感謝你! –

+0

@JoseAntonio請參閱編輯我的答案以獲得不同的解決方案和可能的解釋。 –

+0

非常感謝你,這是我猜想的兩件事的結合,如果你仔細觀察最後的巨大「if」條件,我用變量eHOUR sHOUR犯了一個錯誤,我在參數中改變了這些名字並忘記了改變條件,現在我認爲一切都是錯誤的,因爲一週從來沒有得到正確的價值,一旦我添加.text我可以前進,看到真正的錯誤;現在正常工作沒有「。文本「;我不知道爲什麼變量下面幾行可能會導致奇怪的行爲 –

相關問題