2015-01-05 4 views
0

Итак, я получаю несоответствие типа в скрипте VBA документа Word, однако в редакторе нет какой-либо строки. Может ли кто-нибудь из вас дать мне подсказку что это может быть?Несоответствие типа vba на моем скрипте

Private Sub bt_run_Click() 
'set months array 
Dim months As Variable 
months = Array("Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro") 


With ThisDocument.Tables(0) 

Do While .Rows.Count > 2 
    .Rows(2).Delete 
Loop 


'Ask for year 
Dim req As String 
Dim yr As Integer 
req = InputBox("Insere ano.") 

If IsNumeric(req) Then 
    yr = CInt(req) 
Else 
    MsgBox ("Erro") 
    Return 
End If 


'get previous year last week 
'TODO 

'Now generate current year months 
For i = 1 To 12 
    'get number of mondays on the month (how many weeks belong here) 
    Dim mondays As Integer 
    mondays = MondaysOnMonth(i, yr) 

    'now generate a line for each monday 
    For k = 1 To mondays 

     .Rows.Add 

    Next k 

Next i 

'get next year first week 
'TODO 

End With 


End Sub 


Function MondaysOnMonth(ByVal month As Integer, ByVal year As Integer) As Integer 
Dim mondays As Integer 
mondays = 0 

Dim d As Date 
Dim dtStr As String 
dtStr = "1/" & month & "/" & year 

d = DateValue(dtStr) 

Dim days As Integer 
days = dhDaysInMonth(d) 

For i = 1 To days 

    dtStr = i & "/" & month & "/" & year 
    d = DateValue(dtStr) 
    Dim w As Integer 
    w = Weekday(d, vbMonday) 

    If w = 0 Then 
     mondays = mondays + 1 
    End If 

Next i 
MondaysOnMonth = mondays 

End Function 

Function dhDaysInMonth(Optional ByVal dtmDate As Date = 0) As Integer 
' Return the number of days in the specified month. 
If dtmDate = 0 Then 
    ' Did the caller pass in a date? If not, use 
    ' the current date. 
    dtmDate = Date 
End If 
dhDaysInMonth = DateSerial(year(dtmDate), _ 
month(dtmDate) + 1, 1) - _ 
DateSerial(year(dtmDate), month(dtmDate), 1) 
End Function 

Это довольно много генерирует количество строк, как есть в течение всего месяца в единственной таблице документа.

Я не очень разбираюсь во всех этих видах Visual Basic для приложений, но я предполагаю, что это какой-то тип, который компилятор не может выполнить, однако я не могу понять, что это может быть (и компилятор не дает мне необходимую помощь), так что это может быть?

+0

Вы попробовали F8? Шаг хотя? –

+0

Нет, но попробовал это сейчас, и это когда я назначаю Array в переменную месяцев ... Не должен ли тип Variable быть динамической переменной? –

ответ

0

В моем (ограниченный) опыт, массивы установки немного по-другому в VBA:

'set months array 
Dim months(11) As String 
months(0) = "Janeiro" 
months(1) = "Fevereiro" 
months(2) = "Março" 
months(3) = "Abril" 
months(4) = "Maio" 
months(5) = "Junho" 
months(6) = "Julho" 
months(7) = "Agosto" 
months(8) = "Setembro" 
months(9) = "Outubro" 
months(10) = "Novembro" 
months(11) = "Dezembro" 

Кроме того, я не мог решить таблицу 0, поэтому изменил его к таблице 1, и код, казалось выполнить.

With ThisDocument.Tables(1) 

Надеюсь, это поможет!

+0

Спасибо, это очень помогло. И да, я также узнал, что эти коллекции индексируются в 1, а не в 0 ... –

0

Array Function Возвращает вариант, содержащий массив !!! Dim month As Вариант

0

Вы были так близко.

В исходном коде вы должны быть в состоянии изменить Variable на Variant, и инициализация будет работать так, как вы ожидали.

Здесь я копировать/вставить инициализацию массива, местами в Variant и написал цикл, подтверждающую массив был инициализирован, печатая значения в окне Immediate (нажмите Ctrl+G для просмотра, если она не видна) :

Sub TestMonthArrayInitialization() 

    Dim months As Variant 
     months = Array("Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro") 

    Dim i As Integer 
     For i = 0 To 11 
      Debug.Print months(i) 
     Next i 

End Sub 
Смежные вопросы