Помогите, пожалуйста разобраться с кодом

Программирование на Visual Basic for Applications
lemareka
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 12.10.2007 (Пт) 8:46

Помогите, пожалуйста разобраться с кодом

Сообщение lemareka » 12.10.2007 (Пт) 8:59

Задача кажется довольно простой на первый взгляд:
есть таблица, скопированная as values из pivot table. Нужно заполнить пустоты, возникающие при этом в строках.

Для этого изначально использовался вот такой код:

Код: Выделить всё
Private Sub CommandButton1_Click()
Dim j As Variant
j = 2
Do Until (Sheet1.Cells(j, 5) = "")
If (Sheet1.Cells(j, 1) = "") And (Not (Sheet1.Cells(j, 5) = "")) Then
Sheet1.Cells(j, 1) = Sheet1.Cells((j - 1), 1)
End If
j = j + 1
Loop
End sub


То есть был создан столбец 5, заполненный одинаковыми значениями на протяжении всего массива. И программа ориентировалась на него.

Это все было здорово, пока работа велась с простой таблицецй, в которой было заранее известно количество столбцов. Я просто повторяла этот код дальше, меняя вторую цифру на соответственно 2, 3 и т.д.

Но сейчас нужно сделать более универсальный алгоритм, который не будет зависеть от моего знания количества столбцов и будет останавливаться на столбце, под названием Total, то есть не будет заполнять пустоты там, а во всех остальных столбцах будет.

Вот тут началась проблема, я совсем недавно занимаюсь VBA (буквально недели полторы :) и , видимо, что-то неправильно прописываю.
В общем, я решила попробовать сделать так:
Код: Выделить всё
Private Sub CommandButton1_Click()
Dim j As Variant
j = 2
Dim i As Variant
i = 1
Do Until (Sheet1.Cells(j, 10) = "") And (Sheet1.Cells(1,i) = "Total")
If (Sheet1.Cells(j, i) = "") And (Not (Sheet1.Cells(j, 10) = "")) Then
Sheet1.Cells(j, i) = Sheet1.Cells((j - 1), i)
End If
j = j + 1
i = i + 1
Loop

End Sub


И вот тут он выдает мне ошибку и отказывается работать :(
Помогите, пожалуйста, разобраться!
Ему не нравится как вот эта строка:
Код: Выделить всё
Do Until (Sheet1.Cells(j, 10) = "") And (Sheet1.Cells(1,i) = "Total")

Здесь я еще могу понять, что просто не знаю, как обозначить то, что название столбца "Total" и на нем нужно остановиться

так и эта
Код: Выделить всё
If (Sheet1.Cells(j, i) = "") And (Not (Sheet1.Cells(j, 10) = "")) Then

а тут я вообще не понимаю, что же не так :(((

Помогите, пожалуйста разобраться!

Pavel55
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 27.10.2006 (Пт) 20:11

Сообщение Pavel55 » 12.10.2007 (Пт) 12:55

1) Если у вас лист имеет название Sheet1, то правильно обращаться к нему надо так Sheets("Sheet1")

как пример:

Do Until (Sheets("Sheet1").Cells(j, 10) = "") And (Sheets("Sheet1").Cells(1, i) = "Total")


2) по поводу Not - если вы измените обращение к имени листа, как я указал в п.1, то у вас код заработает. Но если хотите можете его изменить на такой

If (Sheets("Sheet1").Cells(j, i) = "") And (Sheets("Sheet1").Cells(j, 10) <> "") Then

3) Если вы точно знаете, что переменные у вас будут целыми числами, то лучше их объявляете не как Variant, а как Long (число от -2,147,483,648 до 2,147,483,647). Это более правильно, т.к. более рациональнее используете оперативная память компьютера. Для Long отводится 4 байта, а на Variant - 22 байта + длина строки.

Т.е. правильно писать
Код: Выделить всё
Dim i As Long, j As Long


Только никогда не объявляйте переменные так
Код: Выделить всё
Dim a, b, c, d As Long

это неправильно!.

lemareka
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 12.10.2007 (Пт) 8:46

Сообщение lemareka » 12.10.2007 (Пт) 15:27

мне все-таки кажется, что дело не только в этом. Потому что раньше код работал и заполнял пустоты. Проблемы появились только когда я ввела переменную i и попробовала остановить заполнение, когда код придет к первой строке, итому столбцу, носящему название Total.
И тут все перестало работать, стала вылетать ошибка.

Я попроболвала сделать цикл в цикле вот такой:

Код: Выделить всё
Dim j As Variant
j = 2
Dim i As Variant
i = 1
Do Until (Sheet1.Cells(1, i) = "Total")
Do Until (Sheet2.Cells(j, 10) = "")
If (Sheet2.Cells(j, i) = "") And (Not (Sheet2.Cells(j, 1) = "")) Then
Sheet2.Cells(j, i) = Sheet2.Cells((j - 1), i)
End If
j = j + 1
Loop
i = i + 1
Loop
End Sub


Он не выдает ошибку, но пустоты не заполняет :(

не понимаю, в чем же дело?

Pavel55
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 27.10.2006 (Пт) 20:11

Сообщение Pavel55 » 12.10.2007 (Пт) 16:19

Может файлик сюда приложите, где всё это происходит и скажите, что там должно вытворяться?


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 67

    TopList