Ускорить цикл

Программирование на Visual Basic for Applications
Wasup!
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 21.06.2005 (Вт) 11:09

Ускорить цикл

Сообщение Wasup! » 21.03.2006 (Вт) 10:20

Открываю в Excel *.dif (data interchange format) файл, с некоторыми данными. Это текстовый файл, с тегами, размещающими данные по строкам и столбцам. Excel открывает такие файлы, как обычную книгу Excel.

Дальше макросом осуществляется форматирование этой книги, рисование линий и все сохраняется, как xls файл.
Но существует проблема, в разных версиях офиса, dif файл открывается немного по-разному. В 97 числа из dif файла будут открыты в Excel, как числа, а в 2000, как текст. Если при этом в 2000 Excel`е два раза кликнуть по ячейке, она обновится и будет преобразована к числу.

Чтобы сразу преобразовать все числа dif файла в числа xls файла, в любой версии офиса, добавил в макрос цикл.

Код: Выделить всё
for i=1 to 100
  for j=1 to 20 step 2
   cells(i,j).value=ccur(cells(i,j).value)
  next
next


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

Worksheets(1).Calculate, к сожалению, не помогает.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.03.2006 (Вт) 10:40

application.calculation=xlCalculationManual
application.screenupdating=false
for...
application.screenupdating=true
application.calculation=xlCalculationAutomatic


Или так может поможет: columns(1).numberformat="#0.0"

Или может так: columns(1).copy:columns(1).pastespecial xlPasteValues
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 21.03.2006 (Вт) 10:41

Как минимум, есть стандартный рецепт: поставить перед циклом

Код: Выделить всё
Application.Calculation=xlCalculationManual
Application.ScreenUpdating=False


(после цикла xlCalculationAutomatic и True соответственно). Обрабатывать весь столбец сразу таким методом, по-моему, нельзя. Есть метод создать столбец рядом, в него забить формулу "=предыдущий столбец+0" (с Ctrl-Shift-Enter'ом), потом этот столбец скопировать и вставить на место предыдущего как значения. Ессесно, это все можно повторить макросом, но достаточно геморройно. Может, и еще какой способ есть.
Быть... или не быть. Вот. В чём вопрос?

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 21.03.2006 (Вт) 10:44

Numberformat и PasteSpecial, вроде, не помогают...
Быть... или не быть. Вот. В чём вопрос?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.03.2006 (Вт) 10:51

Ввести в любую ячейку _число_ 0.
Скопировать ячейку в буфер.
Выделить нужный столбец.
Сделать .PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd, SkipBlanks:=False, Transpose:=False
Lasciate ogni speranza, voi ch'entrate.

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 21.03.2006 (Вт) 10:52

О, опять забыл про этот способ! :)
Быть... или не быть. Вот. В чём вопрос?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.03.2006 (Вт) 10:52

Либо тоже самое сделать вручную (скопировать 0, выбрать столбец, специальная вставка, вставить значения - сложить).
Lasciate ogni speranza, voi ch'entrate.

Wasup!
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 21.06.2005 (Вт) 11:09

Сообщение Wasup! » 21.03.2006 (Вт) 23:32

Способ с копированием и специальной вставкой вроде очень подходит, но у меня в столбце могут быть пустые ячейки.
При вставке они будут заполнены нулями.
Можно этого как-то избежать?
Например выделить в столбце только непустые ячейки и к ним применить специальную вставку?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 22.03.2006 (Ср) 1:43

SkipBlanks = True
Lasciate ogni speranza, voi ch'entrate.

Wasup!
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 21.06.2005 (Вт) 11:09

Сообщение Wasup! » 22.03.2006 (Ср) 12:59

Странно, но не работает :cry:

Код: Выделить всё
Range("A1").Copy

Range("B1:B6").PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd, SkipBlanks:=True, Transpose:=False


В ячейке А1 у меня 0, в B1:B6 1,2,3, ,4,5
В результате получаю 1,2,3,0,4,5

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 22.03.2006 (Ср) 13:19

Э-э, а что и куда ты копируешь? Зачем, другими словами, A1 копировать в B1:B6?
Быть... или не быть. Вот. В чём вопрос?

Wasup!
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 21.06.2005 (Вт) 11:09

Сообщение Wasup! » 22.03.2006 (Ср) 14:48

Ну как советовали..

alibek
Ввести в любую ячейку _число_ 0.
Скопировать ячейку в буфер.
Выделить нужный столбец.
Сделать .PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd, SkipBlanks:=False, Transpose:=False

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 22.03.2006 (Ср) 14:59

А, сорри, стормозил, все правильно.
Skipblanks=True делает, увы, не то, что тебе нужно - она оставляет значение в той области, куда ты вставляешь данные, если в той области, откуда ты вставляешь, была пустая ячейка.

Тем не менее, по результатам всей дискуссии придумался следующий трюк: сначала выставить всем ячейкам, где стоят цифры в текстовом формате, числовой формат (что ничего не изменит), потом выделить пустую ячейку (возможно, нужно, чтобы у нее был числовой формат) и выполнить

Код: Выделить всё
.PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd, SkipBlanks:=False, Transpose:=False


У меня сработало - цифры стали цифрами, а пустые ячейки остались пустыми.
Быть... или не быть. Вот. В чём вопрос?

Wasup!
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 21.06.2005 (Вт) 11:09

Сообщение Wasup! » 23.03.2006 (Чт) 13:41

В таком варианте работает, спасибо!


Вернуться в VBA

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

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

    TopList