Можно ли сгруппировать элементы массива без цикла?
VBA. Прошу пояснить по методу GetOpenFilename
Пользователь
Сообщений: Регистрация: 01.01.1970
24.02.2010 16:03:25
Метод GetOpenFilename возвращает переменную string (если не нажать Cancel) равную Путь + Имя выбранного файла. Вот интересно, чтобы "выкрутить" из этой переменной отдельно имя файла и отдельно путь к нему, нет ли какого-нибудь способа, не прибегая к текстовым функциям типа InstrRev?
Выкладываю на ваш строгий суд функцию, представляющую собой аналог встроенной в Office 2007 функции "РАБДЕНЬ". Возможно это уже было, но я не нашел, потому пришлось наваять.
Преимущества: 1. Учитывает рабочие субботы и воскресения 2. Работает под 2003
Сам код:
Option Base 1 Public Function РАБДНИ(ByVal ДатаНачальная As Date, КоличДней As Integer, _ Optional ДиапазонПраздников As Variant, Optional ДиапазонИсключений As Variant) As Date ' функция разработана на базе ' Возвращает число, которое представляет дату, отстоящую на заданное количество рабочих дней вперед ' или назад от начальной даты. Отличием от функции MS Office 2007 "РАБДЕНЬ" является учитывание суббот и _ ' воскресений, являющихся рабочими (например - 27.02.2010 г.).
' ДатаНачальная - начальная дата.
' КоличДней - количество дней до или после начальной даты, не являющихся выходными или праздниками. ' Положительное значение аргумента «КоличДней» обозначает будущую дату; отрицательное — прошедшую дату.
' ДиапазонПраздников - необязательный список из одной или нескольких дат, например государственных праздников, ' которые требуется исключить из рабочего календаря (диапазон ячеек, именованный диапазон и т.п. ' перечисление дат не прокатит).
' ДиапазонИсключений - необязательный список из одной или нескольких дат, rоторые требуется исключить из выходных дней. ' Требования - как у "ДиапазонПраздников"
Dim Selebrate, Iskluchenia As Variant Dim Weekend, Holiday As Boolean Dim x, i As Integer
If IsMissing(ДиапазонИсключений) = False Then If ДиапазонИсключений.Count = 1 Then ReDim Iskluchenia(1) Iskluchenia(1) = ДиапазонИсключений.Value Else Iskluchenia = WorksheetFunction.Transpose(ДиапазонИсключений) End If End If
If IsMissing(ДиапазонПраздников) = False Then If ДиапазонПраздников.Count = 1 Then ReDim Selebrate(1) Selebrate(1) = ДиапазонПраздников Else Selebrate = WorksheetFunction.Transpose(ДиапазонПраздников) End If End If
Do Until КоличДней = 0 x = x + IIf(КоличДней > 0, 1, -1)
Weekend = False Holiday = False
'определяем субботу и воскресение If Weekday(ДатаНачальная + x, vbMonday) = 6 _ Or Weekday(ДатаНачальная + x, vbMonday) = 7 Then Weekend = True End If
'определяем, не является ли уикенд рабочим If IsEmpty(Iskluchenia) = False Then For i = LBound(Iskluchenia) To UBound(Iskluchenia) If ДатаНачальная + x = Iskluchenia(i) Then Weekend = False Exit For End If Next i End If
'определяем праздники If IsEmpty(Selebrate) = False Then For i = LBound(Selebrate) To UBound(Selebrate) If ДатаНачальная + x = Selebrate(i) Then Holiday = True Exit For End If Next i End If
If Weekend = False And Holiday = False Then КоличДней = КоличДней - IIf(КоличДней > 0, 1, -1) End If
Loop
РАБДНИ = ДатаНачальная + x
End Function
Может, кому-нибудь пригодится.
VBA. Можно ли не открывая книгу перебрать в цикле названия листов?
Пользователь
Сообщений: Регистрация: 01.01.1970
16.02.2010 17:00:09
Если книга открыта, то можно так: Dim Book, iArray() As String iBook = "Test.xls" With Application.Workbooks.Item(iBook) For x = 1 To .Sheets.Count ReDim Preserve iArray(x) iArray(x) = .Sheets.Item(x).Name Next x End With
Есть ли способ обработать закрытую книгу? Передача переменной iBook полного пути не помогла.
Как правильно применить формулу массива СУММ() в VBA
Пользователь
Сообщений: Регистрация: 01.01.1970
09.11.2009 17:35:11
Замучился с синтаксисом! Помогите, прошу.
Хочу в VBA написать формулу, которая в excel'е выглядит так: {=СУММ(P2:P4*(A2:A4=A3)*(B2:B4=B3))}
Сделал так:
Sub test() Dim ДиапазонСуммирования As Range Dim ДиапазонУсловий1 As Range Dim ДиапазонУсловий2 As Range Dim ПеременнаяРезультат As Double
Set ДиапазонСуммирования = Worksheets("Лист2").Range("P2:P4") Set ДиапазонУсловий1 = Worksheets("Лист2").Range("A2:A4") Set ДиапазонУсловий2 = Worksheets("Лист2").Range("B2:B4") ПеременнаяРезультат = WorksheetFunction.SumProduct((ДиапазонСуммирования) * _ (ДиапазонУсловий1 = Worksheets("Лист2").Range("A3")) * _ (ДиапазонУсловий2 = Worksheets("Лист2").Range("B3"))) MsgBox (ПеременнаяРезультат) End Sub
выдает ошибку: Run-time error '13': Type mismatch
Задача - получение в нужной ячейке результата, а не формулу.
VBA обращение к листу
Пользователь
Сообщений: Регистрация: 01.01.1970
04.02.2009 14:30:31
Как правильно написать обращение к листу с таким расчетом, что при изменении местоположения листа в книге или его названия код не пришлось бы переписывать? Если обращаться Worksheets("Справочник").Range("A1") = ... то нельзя менять название, но можно положение, а если Worksheets(2).Range("A1") = ... то можно название, но нельзя положение Как обратиться по внутреннему имени - Лист2, например? Оно ведь, если я не ошибаюсь, не меняется при изменении названия или места.
Подсчет количества уникальных записей
Пользователь
Сообщений: Регистрация: 01.01.1970
20.11.2008 12:36:46
Столкнулся с проблемой, господа! Есть реестр реализаций продукции. Данные - номер, дата, сумма отгрузки и контрагент. Задача - необходимо определить, например, сколько дней в месяце грузился конкретный контрагент, учитывая, что этот контрагент может как вообще не грузиться, так и несколько раз в день. Сформировал сводную таблицу и уже пару часов не могу решить вопрос. Оговорюсь, что в реестре около 8 тысяч реализаций.
Условие, на вхождение строки
Пользователь
Сообщений: Регистрация: 01.01.1970
18.07.2008 18:16:39
Возникла небольшая сложность. Никто не подскажет, как в формуле указать не конкретное условие, например: ЕСЛИ(А1="текст";... а указать вместо этого, что ячейка А1 содержит или начинается с "текст"? Что-то вроде фильтра.
Ошибка Excel?
Пользователь
Сообщений: Регистрация: 01.01.1970
27.03.2008 16:32:48
Господа, не подскажете, почему в Excel'е иногда выполняя операцию, например: 36 8314.21 - 353247.25 получается значение 15066.960000000021827873 ??? Пример вложил.
Представление даты
Пользователь
Сообщений: Регистрация: 01.01.1970
20.02.2008 10:15:14
Задача: написать в одной ячейке по тексту: "Выбран период: с 01.01.2008 г. по 20.02.2008 г." (для печатной формы). Условие: начальная и конечная дата - указываются в отдельных ячейках. Пробовал просто: ="Выбран период: с "&D1&" г. по "&D2&" г." возвращает: "Выбран период: с 39448 г. по 39498 г." пробовал посложнее: ="Выбран период: с "&ДЕНЬ(D1)&"."&МЕСЯЦ(D1)&"."&ГОД(D1)&" г. по "&ДЕНЬ(D2)&"."&МЕСЯЦ(D2)&"."&ГОД(D2)&" г." возвращает: "Период: с 1.1.2008 г. по 20.2.2008 г." выход, конечно, но не очень красиво... Никто не сталкивался?
Ссылка на массив
Пользователь
Сообщений: Регистрация: 01.01.1970
14.02.2008 11:24:37
Доброго времени суток! есть некая формула: =СУММПРОИЗВ((Лист1!$D$2:$D$65000="Яблоки")*(Лист1!$E$2:$E$65000>=1000);Лист1!$G$2:$G$65000) суммирующая значения столбца G на Лист1 при усливии, что соответствующей строке столбца D значение "Яблоки", а в столбце Е - значение 1000. все отлично работает, но проблема в производительности. из-за того, что такая формула на 1000 строчках, слишком долго пересчитывает. переделать формулу в =СУММПРОИЗВ((Лист1!D:D="Яблоки")*(Лист1!E:E>=1000);Лист1!G:G) не получилось, выдает ошибку. каким образом можно ограничить количество строк формуле, т.е. дать ссылку только на непустые ячейки?
Модуль, выполняемый при открытии файла
Пользователь
Сообщений: Регистрация: 01.01.1970
11.02.2008 18:19:43
Требуется, чтобы при открытии файла открывался определенный лист. Заранее благодарю.