KL, такие навороты мне не нужны. У меня просто таблица заполняется данными из ADODB запроса. Некоторые данные получаются из других обычной арифметикой. А всё остальное считается прямо в таблице как обычно.
Ещё раз огромное спасибо.
Вот ещё неожиданно проблема всплыла.
У меня в таблице данные заносятся в 12 колонок под 12 часов. Но с переходом на летнее/зимнее время часов может оказаться и 11 и 13. Пришлось нагородить вот такой скрипт.
- Код: Выделить всё
Sub test2()
Dim i As Integer, n As Integer
sTime = "C5:N5"
dtStart = #8/2/2008 6:00:00 AM#
dtEnd = #8/2/2008 6:00:00 PM#
i = DateDiff("h", dtStart, dtEnd)
n = Range(sTime).Columns.Count
Do
If n = i Then Exit Do
If n > i Then ' удаляем лишние столбцы
Worksheets(wsOut).Columns(n / 2 + Range(sTime).Column).Delete
n = n - 1
End If
If n < i Then ' добавляем столбцы
Application.CutCopyMode = False
Worksheets(wsOut).Columns(n / 2 + Range(sTime).Column).Select
Selection.Copy
Selection.Insert Shift:=xlToRight
Application.CutCopyMode = False
n = n + 1
End If
Loop
End Sub
Типа, если на пальцах, задумка такая: когда ширина диапазона столбцов не сходится с количеством часов в смене (с 06:00 до 18:00 или с 18:00 до 06:00), то средний столбец этого диапазона либо удаляем, либо размножаем.
Получилось как-то коряво:
1. Не нравится мне
n=n+1. Лучше было бы перетащить
n = Range... внутрь
Do и расширять сам диапазон: "C5:N5" --> "C5:O5" --> и т.д. А как это сделать? - не знаю.
2. Кусок с копированием столбца я получил записью макроса. Вроде бы всё работает... в нормальной таблице.
Но у моей в "шапке" ячейки "C1:O1" объединёны. Там заголовок. И
Worksheets(wsOut).Columns(n / 2 + Range(sTime).Column).Select выделяет не только столбец "I:I", а весь диапазон "C:O". Если снять объединение, то получается как надо. А вручную мышкой и с объединенными правильно работает.
3. А
i = DateDiff("h", dtStart, dtEnd) считает с учётом переходов зима-лето или нет?
Ещё вопрос относительно
Optional- Код: Выделить всё
Dim dtStart As Date
Public Function StartTime(Optional D As Date)
If (задан D) Then
dtStart = DateAdd("h", 6, D)
Debug.Print "задан StartTime="; dtStart
End If
StartTime = dtStart
End Function
Как проверить, задали необязательный параметр или нет?
Методом тыка установил, что пустой параметр типа
Date соответствует
#12:00:00 AM#. Ну а если кому-то вздумается задать именно это значение?