Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Обращение в ячейке / 10 сообщений из 10, страница 1 из 1
22.02.2012, 15:50
    #37674636
lu0
lu0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение в ячейке
подскажите полиз: какой вариант обращения к ячейкам быстрее
1.
Код: vbnet
1.
2.
3.
4.
5.
nRow=25
For I=1 to 100
  cColName=cCol(I, "D") ' ф-ция, возвращяющая I-тую от колонки D в формате A1
  Sheet.Range(cColName & nRow). ...
Next


или
2.
Код: vbnet
1.
2.
3.
4.
5.
nRow=25
For I=1 to 100
  nColIndex=nCol(I,"D") ' ф-ция, возвращающая Индекс (Integer) 
  Sheet.Cells(nColIndex, nRow). ...
Next



щас пока использую 1-й вариант, исключительно из-за удобства разбора кода
...
Рейтинг: 0 / 0
22.02.2012, 15:52
    #37674644
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение в ячейке
в чем проблема замерить?
...
Рейтинг: 0 / 0
22.02.2012, 15:56
    #37674656
lu0
lu0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение в ячейке
Лень. Может кто делал уже
...
Рейтинг: 0 / 0
22.02.2012, 15:58
    #37674662
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение в ячейке
по-моему пост на форуме с оформлением и каментами было сделать дольше, чем протестировать

мы же не знаем содержимого ваших функций
...
Рейтинг: 0 / 0
22.02.2012, 16:03
    #37674676
lu0
lu0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение в ячейке
Ексель щас работает :) так что пост быстрее :)

Функции пока абстрактные. Первая переводит индекс в букву, например 4 в D, вторая делает наоборот.
щас чащще пишу Sheet.Range("A" & nRow). ... читать так удобнее... вот и подумываю может вызов Sheet.Cells(nRow,nCol("D")). .. будет быстрее
Может тестировал кто уже
...
Рейтинг: 0 / 0
22.02.2012, 16:08
    #37674692
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение в ячейке
Ну вот ты ленивый, а
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Debug.Print Now
For j = 1 To 500000
i = Cells(1, 1)
Next
Debug.Print Now
For j = 1 To 500000
i = Range("A1")
Next
Debug.Print Now


ну в общем, я так и подозревал
...
Рейтинг: 0 / 0
22.02.2012, 16:44
    #37674764
lu0
lu0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение в ячейке
спасибо.

подведу итог:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
Function nColc(aColName As String, Optional aShift As Integer = 0) As Integer
Dim nBase As Integer
  If aColName = "" Then
    nBase = 1
  Else
    If Len(aColName) = 2 Then
      nBase = (Asc(Mid(aColName, 2, 1)) - 64) * 26
    Else
      nBase = 0
    End If
    nBase = nBase + Asc(Mid(aColName, 1, 1)) - 64
  End If
  
  nColc = nBase + aShift
End Function

Sub vv()
  Debug.Print Now
  For j = 1 To 500000
  i = Cells(1, nColc("A"))
  Next
  Debug.Print Now
  For j = 1 To 500000
  i = Range("A" & 1)
  Next
  Debug.Print Now
End Sub



результат:
Код: plaintext
1.
2.
22.02.2012 16:41:42 
22.02.2012 16:41:44 
22.02.2012 16:41:49 

вывод:
переходим на новые рельсы
...
Рейтинг: 0 / 0
22.02.2012, 17:59
    #37674882
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение в ячейке
> Автор: lu0
> подведу итог:
> результат:
>
> 22.02.2012 16:41:42
> 22.02.2012 16:41:44
> 22.02.2012 16:41:49
> вывод:

Не правильный у тебя вывод. Сравни моё время:
код 1(почти исходный)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Sub vv()
'Dim j As Long, i As Long
'Dim j, i
Dim dt As Date
  dt = Now
  Debug.Print Format(#12:00:00 AM#, "hh:mm:ss.sss")
  For j = 1 To 500000
  i = Cells(1, 1) '.Value
  Next
  Debug.Print Format(Now - dt, "hh:mm:ss.sss")
  dt = Now
  For j = 1 To 500000
  i = Range("A" & 1) '.Value
  Next
  Debug.Print Format(Now - dt, "hh:mm:ss.sss")
End Sub

Время:
00:00:00.000
00:00:03.033
00:00:07.077
код 2 переработанный
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Option Explicit
Sub vv()
Dim j As Long, i As Long
Dim dt As Date
  dt = Now
  Debug.Print Format(#12:00:00 AM#, "hh:mm:ss.sss")
  For j = 1 To 500000
  i = Cells(1, 1) '.Value
  Next
  Debug.Print Format(Now - dt, "hh:mm:ss.sss")
  dt = Now
  For j = 1 To 500000
  i = Range("A" & 1) '.Value
  Next
  Debug.Print Format(Now - dt, "hh:mm:ss.sss")
End Sub

Время:
00:00:00.000
00:00:02.022
00:00:07.077
код 3 доработанный
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Option Explicit
Sub vv()
Dim j As Long, i As Long
Dim dt As Date
  dt = Now
  Debug.Print Format(#12:00:00 AM#, "hh:mm:ss.sss")
  For j = 1 To 500000
  i = Cells(1, 1).Value
  Next
  Debug.Print Format(Now - dt, "hh:mm:ss.sss")
  dt = Now
  For j = 1 To 500000
  i = Range("A" & 1).Value
  Next
  Debug.Print Format(Now - dt, "hh:mm:ss.sss")
End Sub

Время:
00:00:00.000
00:00:03.033
00:00:07.077

Теперь вывод: Всегда явно объявляйте переменные! Т.е. используйте
Option Explicit

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.02.2012, 08:47
    #37676105
lu0
lu0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение в ячейке
Игорь, Вы меня простите, но:
1. Вы читали первый пост??? Если "да", то в чем мои выводы не верны?
2. В чем выигрыш первого Вашего примера над третьим? Т.е. что позволяет Вам утверждать что применение опции "Option Explicit" ускоряет код по-сравнению с явным объявлением переменных.
...
Рейтинг: 0 / 0
24.02.2012, 18:26
    #37677439
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение в ячейке
> Автор: lu0
> Игорь, Вы меня простите, но:
> 1. Вы читали первый пост??? Если "да", то в чем мои выводы не верны?

По вопросу - верны. Переходить на новые рельсы нужно :)
А выводы верны, но при, на мой взгляд, не совсем правильной постановке эксперемента. И я хотел показать именно это. Что
в прочем мне не удалось :(

> 2. В чем выигрыш первого Вашего примера над третьим? Т.е. что позволяет Вам утверждать что применение опции
> "Option Explicit" ускоряет код по-сравнению с явным объявлением переменных.

Мне это позволяет утверждать разница между первым примером и вторым, потому, что именно в них разница в объявлении
переменных.
А третий я просто привел для полноты картины и что происходит в нем я объяснить не могу :(

И я не утверждал что опция Option Excplicit дает какую-то разницу в скорости выполнения по сравнению с явным объявлением
переменных. В твоем примере переменные не объявлены, и мой первый - аналог твоего примера, а мой второй пример аналог
твоего, но с явным объявлением переменных. И именно выигрыш по времени выполнения примера с явным объявлением переменных
и дает мне возможность утверждать что использование Option Excplict - как залог явного объявления переменных, сделает
наши программы более быстродейтсвенными :)

Во как завернул

p.s. кстати
код
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
Sub vv()
Dim j As Long, i As Long
Dim dt As Date
  Debug.Print Format(#12:00:00 AM#, "hh:mm:ss.sss")
  dt = Now
  For j = 1 To 500000
  i = Cells(1, 1) '.Value
  Next
  Debug.Print Format(Now - dt, "hh:mm:ss.sss")
  dt = Now
  For j = 1 To 500000
  i = Range("A1") ' & 1) '.Value
  Next
  Debug.Print Format(Now - dt, "hh:mm:ss.sss")
  dt = Now
  For j = 1 To 500000
  i = Cells(1, 1) '.Value
  Next
  Debug.Print Format(Now - dt, "hh:mm:ss.sss")
  dt = Now
  For j = 1 To 500000
  i = Range("A1") ' & 1) '.Value
  Next
  Debug.Print Format(Now - dt, "hh:mm:ss.sss")
End Sub

дает такое время:
00:00:00.000
00:00:02.022
00:00:06.066
00:00:03.033
00:00:06.066
почему - х его з :(

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Обращение в ячейке / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]