2017-02-09 2 views
2

У меня есть этот кодVBA ошибка во время выполнения 13 - при попытке выполнить петлю

Sub fillinvalues() 

Dim interest As Double 
Dim rate As Double 
Dim payment As Double 
Dim period As Double 
Dim ws As Worksheet 
Dim i As Object 
Dim begbal As Double 

Set ws = Worksheets("Sheet1") 
payment = ws.Range("H3").Value 
rate = ws.Range("H4").Value 
begbal = ws.Range("E3").Value 
begbal = 80000 

Worksheets("Sheet1").Range("A2").Value = "PaymentNumber" 
Worksheets("Sheet1").Range("B2").Value = "Payment/period" 
Worksheets("Sheet1").Range("C2").Value = "Principal" 
Worksheets("Sheet1").Range("D2").Value = "Interest" 
Worksheets("Sheet1").Range("E2").Value = "RemainingBal" 

ws.Range("A1:G1").Value = "Monthly Payments at effective monthy interest rate for 25-years" 

ws.Range("A3").Value = 0 
ws.Range("A3").Select 
ws.Range("A3").Activate 
period = 0 

Do Until period = 301 
' period = 0 
ActiveCell.Offset(period, 0) = period 
ActiveCell.Offset(period, 1) = payment 
period = period + 1 
Loop 

Cells(3, 2).ClearContents 

Cells(4, 4).Select 
Do Until ws.Columns(1) = Empty 
ActiveCell.Value = ActiveCell.Offset(-1, 1).Value * rate 
ActiveCell.Offset(0, -1).Value = ActiveCell.Offset(0, -2).Value - ActiveCell.Value 
'For Each i In ws.Columns(4) 
'i = ActiveCell.Offset(-1, 1).Value * rate 
'ActiveCell.Value = i 
ActiveCell.Offset(0, 1).Value = ActiveCell.Offset(-1, 1).Value - ActiveCell.Offset(0, -1).Value 
ActiveCell.Offset(1, 0).Activate 
'Next i 

Loop 
End Sub 

Но я получаю ошибку несоответствия типов на ячейку D4 (где второй цикл начинается после того, как клетки (4,4) Я не понимаю, почему, поскольку я объявлял ставку как двойную, а значение текущей ячейки - двойное (см. Изображение прилагается). enter image description here

+2

'ws.Columns (1) = Empty' должен быть' ActiveCell = vbNullString', но вам следует избегать использования activeecell ... Это супер медленно Попробуйте использовать 'ws.Cells (4, i)' with 'For i = 4 до LastRow' и см. Это для последнего: http://stackoverflow.com/documentation/excel-vba/918/methods-for-finding-the-last-used-row-or-column-in-a-workheet/ 24282/find-the-last-non-empty-row-in-workheet # t = 201702091453205437082 – R3uK

+0

Я попытался использовать For..each .. с объявлением объекта, но ему не повезло. Я все еще новичок, когда дело доходит до разработки VB-программ, поэтому я настойчиво держу это просто. Спасибо за помощь. –

ответ

5

Я не могу комментировать, потому что у меня нет достаточного количества репрессий, но Я бы сказал, что что-то происходит с:

Do until ws.Columns(1) = Empty 

Когда я тестировал это в новой книге, я всегда был прав, когда тестировал, если column = empty. Я считаю, что это потому, что «Пусто» означает, что значение не было присвоено, и оно не является свойством диапазона.

Я также согласен с R3uK. Избегайте использования activecell и смещений. Если вы не знаете, как много ресурсов для этой проблемы. Гораздо лучше ссылаться на ссылки на ячейки или использовать массив.

Наконец, вы также можете столкнуться с проблемой при вычитании значений без какой-либо обработки ошибок или проверки значений. Как и в случае, например, ячейка может содержать строку. Если вы затем попытались вычесть или размножить эту строку, вы столкнулись бы с ошибкой.

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

EDIT: Полностью упущен факт, что R3uK обработал пустую вещь, прежде чем я это сделал.

+0

Да, вы были благодарны за то, что указали мне в правильном направлении. –

+0

Без проблем, рад, что я мог бы помочь! –