Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA (часть 2)

Модерирует : ShIvADeSt

ShIvADeSt (11-01-2010 10:17): http://forum.ru-board.com/topic.cgi?forum=33&topic=10903  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

   

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

 
 
Обсуждаем вопросы только по Excel VBA
(программирование макросов, скриптов, пользовательских функций и т.п.).
Приветствуются ссылки на ресурсы и справочную литературу по теме.
 
Вопросы по работе с MS Excel, не относящиеся к программированию, задаем в теме Excel FAQ

 
Обратите внимание, этот топик для помощи в изучении и использовании VBA. Посему запросы типа "Напишите мне такой-то макрос, я VBA не знаю и знать не хочу" не приветствуются.
Древняя мудрость: "Накорми голодного рыбой и он погибнет, научи его ловить рыбу и ты спасешь его."(R)
 
Предыдущие ветки топика: Часть 1
 
Информация общего характера:
  • Список соответствия имен функций в английской и русской версиях Excel
  • Описание Microsoft Excel File Format (eng.)
     
    Рекомендации:
    Если у Вас есть проблема, не решаемая стандартными средствами Excel (об этом можно уточнить здесь) или требующая автоматизации, попробуйте для начала записать макрос самим Excel через меню Сервис (Tools) - Макрос (Macro) - Начать запись (Record New Macro). Подробнее здесь. В большинстве случаев получившийся код (Сервис-Макрос-Макросы-Изменить) Вас не удовлетворит, но подскажет, какие объекты-методы-свойства использовать.  
    Другой Ваш помощник - Просмотр объектов (Object Browser). Ну и встроення помощь (F1), естественно.
     
    Если Вы в тупике, покажите Ваш код (или часть кода) здесь.  Если вылазит ошибка, цитируйте ее полностью. Если код слишком большой, используйте тeг [more].
    Используйте отладчик - Breakpoints (F9), Watches (Shift-F9), Steps (F8 и др.) Сильно облегчает поиск ошибок.

     
    Рекомендуется к прочтению:
  • Первые шаги с Excel VBA
  • Excel VBA: Приёмы программирования
  • WinApi. Лекция из курса "Основы офисного программирования и язык VBA" (для продвинутых)
  • Daily Dose of Excel (eng.) - тематический блог: советы по работе с Excel и прочие материалы
  • Excel Macros & Excel VBA Code Tips, Tricks (eng.) - советы, трюки и уловки
  • Mr. Excel (forum) (eng.) - весьма оживленный форум по Excel&VBA.
  • Приемы, хитрости, трюки и нюансы работы в Microsoft Excel - сайт "Планета Excel", целиком посвященный Excel и всему, что с ним связано.
  • Microsoft Excel: Таблицы и VBA. Справочник. Вопросы и Ответы. Советы. Примеры.  
     
    Родственные топики:
  • Вопросы по работе с MS Excel - Excel FAQ - часть 1, часть 2, часть 3
  • Технические проблемы с MS Office 2003 или Office XP.
  • Word VBA все вопросы по Word VBA туда
  • Access все вопросы по программированию в Access туда
  • Книжульки по VBA - книги по программированию с использованием VBA
     
    Конкретные вопросы:
    Форма-заставка
    Как запустить макрос при изменении положения курсора или значения ячейки
  • Пример 1
  • Пример 2
  • Пример 3 (проверка области)
  • Пример 4
  • Пример 5
    Зацикливание в функции Change или SelectionChange
     
    Ранжирование без пробелов (макрос включает функции сортировки массива и удаления дубликатов, работает и в Excel 2007)
  • под Office 97
     
    Добавление в главное меню своего пункта, ассоциированного с макросом
    Создание ярлыка на рабочем столе
    Снятие защиты листа при забытом пароле
    Смена раскладки клавиатуры
    Скролл формы колесом прокрутки мыши
    Оптимизация кода по быстродействию использованием массивов
    Найти "чужое" окно и нажать в нем кнопку (вписать текст в текстовое поле)
    Работа с UNICODE-символами в VBA: запись, чтение из ячейки, перевод в ASС и обратно
    Как программно подключить дополнительные библиотеки (например, "Microsoft Scripting Runtime" или "Microsoft ActiveX Data Objects 2.8 Library) через References

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:58 23-04-2007 | Исправлено: JekG, 22:32 10-01-2010
    Alexikit

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Only4You
    Вашу задачу можно решить написав внешнюю программу, которая будет читать необходимые .xls файлы и записывать в один, это можно сделать например на VB. Или написать макрос в файле в который будет записываться информация, тогда из него будут отрываться необходимые файлы и записываться. Видимо Вам информацию из каждого файла надо записывать на отдельный лист.
    Например слледующий код откроет четыре книги (Книга1.xls, Книга2.xls, Книга3.xls и  Книга4.xls) и вставит считанную информацию на добавленные листы
     
     
    Код:
     
    Sub test1()
    Dim book1 As Workbook
    Dim list1 As Worksheet
    Dim listak As Worksheet
    Set xls = CreateObject("Excel.Application")
    Dim nam As String
    Dim nam1 As String
    Dim a(2 To 12) As Double
    Dim i, j As Integer
    For j = 1 To 4 'задаем последовательность книг
        nam1 = CStr(j)
        nam = "D:\книга" + nam1 + ".xls"
        Set book1 = xls.Workbooks.Open(nam)  'открываем книгу с данными
        Set list1 = book1.Worksheets(1)
          With book1
          For i = 2 To 12
          a(i) = Val(list1.Cells(i, 3))   'читаем данные
          Next
        End With
        book1.Close
         
       With ActiveWorkbook
        Set listak = ActiveWorkbook.Worksheets.Add ' добавляем листы
        listak.name = "11_" + Str(j) ' С заданными именами
        Set listak = ActiveWorkbook.Worksheets.Item("11_" + Str(j))
          For i = 2 To 12
         listak.Cells(i, 1) = a(i)  ' вставляем данные в активную книгу
          Next
       End With
     Next
    xls.Quit
    End Sub
     

    Всего записей: 79 | Зарегистр. 01-04-2009 | Отправлено: 13:33 11-12-2009
    metrim

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здравствуйте.  
    Задача простейшая, но додуматься как сделать что то не получается.
    Есть 2 листа "zero" и "data"
    На обоих листах есть столбцы например В с данными. Нужно получить на листе "data" стлбец C с результатами вычитания данных столбца на листе "data" из данных "zero".
    Т.е. допустим формулой сие записывается просто, например в ячейке С2 пишем формулу "=B2-'zero'!B2" и т.д.
    НО
    Я хочу сделать пользовательскую функцию, что бы она задавалась видом например zeroing_oprion(B2) и производила это самое вычитание.
     
    Как это сделаь поизящнее? Проблема еще в том, что параметром функции вроде как в програму передается значение ячейки, а не её адрес, так что что бы передать в скрипт адрес ячейки приходится записывать "=zeroing_oprion(ЯЧЕЙКА("адрес";В2))" и т.д.
     
    Все это должно делаться как то очень просто, так что поможите плз
     
    ЗЫ Вообще вся эта затея с пользовательской функцией из за того, что в каждом конкретном случае название "нулевого листа" может разнится, и его текущее имя хранится у меня в именванной ячейке "zero_sample"
     
    Добавлено:
    Пардон, все действительно легко и просто оказывается
     

    Код:
     
    Function zeroing_option(trubka_lev)  
        tr = Range("zero_sample").Value
        zeroing_option = trubka_lev - Range(tr & "!" & trubka_lev.Address)
        Application.Calculation = xlCalculationAutomatic
    End Function
     

    Всего записей: 110 | Зарегистр. 05-12-2002 | Отправлено: 20:24 13-12-2009
    metrim

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    только вот опять туплю по простой задачке.
    есть ячейка допустим R5C16 , нужно и ниже по столбику идут значения. Нужно определить последнюю заполненную ячейку и получить для формулы диапазон например R5C16:R31C16
     
    Вообще все это нужно для подстановки в формулу  

    Код:
    Cells(2, 14).FormulaR1C1 = "=SUMX2MY2(R5C16:R11C16,R5C17:R11C17)"

    Всего записей: 110 | Зарегистр. 05-12-2002 | Отправлено: 02:56 14-12-2009
    SIgor33

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Есть исходных файл XML в хз какой кодировке. VB его считывать с помощью XML DOM категорически отказывается, не видит данных.
    При этом, если пересохранить этот же файл через Notepad в UTF8 все прекрасно читается.
    Вопрос:
    Как прочитать файл целиком (в виде текстового) и сохранить в кодировке UTF8, чтобы потом скормить XML DOM
    strConv не помогает.

    Всего записей: 652 | Зарегистр. 03-03-2009 | Отправлено: 14:28 15-12-2009
    pribush

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ребят помогите пожалуйста началась зачетная неделя, а у меня висит макрос по экселю который я вообще не понимаю как сделать помогите кто может очень надо!
     
    Вот задание!
     
    Имеется столбец, состоящий из одного или более столбцов меньшей высоты, содержащих числа; соседние столбцы разделены между собой одной или более пустыми ячейками. Во второй столбец записать высоты этих столбцов.
     
    Спасибо за внимание всем благодарен!

    Всего записей: 3 | Зарегистр. 14-12-2009 | Отправлено: 18:03 15-12-2009
    ludo4k2009

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите пожалуйста написать макрос для экселя......абсолютно не понимаю макросы......
     
    Имеется столбец чисел неизвестной заранее высоты. Найти сумму тех элементов столбца, значения которых находятся в заданном диапазоне [X1, X2]. Числа X1 и X2 записаны в ячейки B1 и B2 соответственно. Результат записать в ячейку B3.
     
    Как я поняла с столбце А записаны именно те значения которые надо проанализировать....
     
    и мне надо сложить только те числа из столбца А, которые будут больше числа записанного в ячейке В1 но меньше числа в ячейке В2. Он должен выбрать еще что суммировать.Вот что мне нужно.

    Всего записей: 2 | Зарегистр. 15-12-2009 | Отправлено: 23:21 15-12-2009
    vlth

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ludo4k2009
    Sub Example()
    Dim X As Double, Y As Double, Summa As Double
    Dim i As Long: i = 1
    With ThisWorkbook.Worksheets("Лист1")
    X = .Cells(1, 2): Y = .Cells(2, 2)
        Do Until IsEmpty(.Cells(i, 1))
            If .Cells(i, 1) > X And .Cells(i, 1) < Y Then _
                Summa = Summa + .Cells(i, 1)
            i = i + 1
        Loop
        .Cells(3, 2) = Summa
    End With
    End Sub

    Всего записей: 258 | Зарегистр. 22-01-2008 | Отправлено: 01:23 16-12-2009
    ludo4k2009

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    СПАСИБО!!!!!!!!!!!!!!!!!!!!!!! все работает!! Вы просто жизнь спасли..

    Всего записей: 2 | Зарегистр. 15-12-2009 | Отправлено: 09:23 16-12-2009
    SIgor33

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Excel 2003. Как кодом VBA "Пропустить ошибку" для текстовых цифр?
    Подскажите пожалуйста.

    Всего записей: 652 | Зарегистр. 03-03-2009 | Отправлено: 10:11 16-12-2009
    vlth

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    pribush

    Код:
    Sub Example()
    Dim i As Long, k As Long, x As Long
    With Thisworkbook.Worksheets("Лист1")
        x = .UsedRange.Rows.Count 'вариант x=.cells(65536,1).end(xlup).row
        For i = 1 To x
            k = k + 1
            If IsEmpty(.Cells(i + 1, 1)) Then
                .Cells(i, 2) = k
                If i = x Then Exit Sub
                Do
                    i = i + 1
                Loop While IsEmpty(.Cells(i, 1))
                k = 1
            End If
        Next i
    End With
    End Sub

    Всего записей: 258 | Зарегистр. 22-01-2008 | Отправлено: 18:16 16-12-2009 | Исправлено: vlth, 18:40 16-12-2009
    JekG

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vlth
    Немного разобрался с работой макроса. ВАш вариант не сработал изначально, потому пришлось его слегка подправить. Вышло вот что

    Код:
    Option Explicit
    Function prcEmplJobTimeCount(strSName As String)
    Dim objSName As Range, intI As Integer, lngFRow As Long, lngLRow As Long
    Dim aintWeeks() As Integer, asngHours() As Single, IntJ As Integer
    Dim sngSumOfWeekHours As Single, intWeekN As Integer
    Dim intMinutes As Integer, intHours As Integer
     
    On Error GoTo ExitProc
    With ThisWorkbook.Worksheets("Лист1")
                        ' Предполагается, что все записи на листе отсортированы по фамилиям,
                        ' а также, что искомая фамилия в таблице обязательно присутствует
                        ' (иначе - ошибка и выход из программы):
        lngFRow = .Columns(4).Find(strSName, LookIn:=xlValues).Row
        intI = lngFRow
        Do While .Cells(intI, 4) = strSName
            intI = intI + 1
        Loop
        lngLRow = intI - 1
        Set objSName = Union(Range(.Cells(lngFRow, 2), .Cells(lngLRow, 2)), _
            Range(.Cells(lngFRow, 8), .Cells(lngLRow, 8)))
    End With
     
    'objSName.Select 'Эта строка нужна только на момент отладки (выделяем все записи по сотруднику)
     
    With objSName
        For intI = 1 To lngLRow - lngFRow
            If .Cells(intI, 7) = "Вход" And .Cells(intI + 1, 7) = "Выход" _
                And Day(.Cells(intI, 1)) = Day(.Cells(intI + 1, 1)) Then
                 
                intWeekN = DatePart("ww", .Cells(intI, 1), vbMonday)
                ReDim Preserve aintWeeks(IntJ): aintWeeks(IntJ) = intWeekN
                ReDim Preserve asngHours(IntJ)
                asngHours(IntJ) = DateDiff("s", .Cells(intI, 1), .Cells(intI + 1, 1)) / 3600
                 
                intI = intI + 1
                IntJ = IntJ + 1
            End If
        Next intI
    End With
     
    Set objSName = Nothing
     
    sngSumOfWeekHours = asngHours(0)
    intWeekN = aintWeeks(0)
     
    For intI = 1 To IntJ - 1
        If intWeekN = aintWeeks(intI) Then
            sngSumOfWeekHours = sngSumOfWeekHours + asngHours(intI)
        Else
            intHours = Val(sngSumOfWeekHours)
            intMinutes = (sngSumOfWeekHours - intHours) * 60
             
            'Вывод, к примеру, в окно отладки:
             
            Debug.Print strSName & ", неделя "; Format$(aintWeeks(intI - 1), "0#: ") _
                & Format$(intHours, "0# ч") & ". " & Format$(intMinutes, "0# мин") & "."
               prcEmplJobTimeCount = intHours
            intWeekN = aintWeeks(intI)
            sngSumOfWeekHours = asngHours(intI)
        End If
    Next intI
     
    intHours = Val(sngSumOfWeekHours)
    intMinutes = (sngSumOfWeekHours - intHours) * 60
             
    'Вывод в окно отладки последней записи (если в таблице данных больше чем за 1 неделю):
             
    Debug.Print strSName & ", неделя "; Format$(aintWeeks(intI - 1), "0#: ") _
        & Format$(intHours, "0# ч") & ". " & Format$(intMinutes, "0# мин") & "."
         prcEmplJobTimeCount = intHours
    ExitProc:
    'Обработку ошибок не делаю
    If Err.Number <> 0 Then MsgBox "Ошибка:" & Err.Description
    End Function
     
    Sub Test()
    Dim s, n, j, i, b, fam(1000) As String
    n = 1
    fam(1) = Range("D5")
    i = 5
    While Range("D" & i) <> ""
     b = False
     For j = 1 To n
      If Range("D" & i) = fam(j) Then
       b = True
      End If
     Next j
     If Not b Then
      n = n + 1
      fam(n) = Range("D" & i)
     End If
     i = i + 1
    Wend
        Range("K5:M1663").Select
        Selection.ClearContents
    For i = 1 To n
    s = prcEmplJobTimeCount(fam(i))
     Range("K" & (5 + i)) = fam(i) + " проработал(а): "
     Range("L" & (5 + i)) = s
     Range("M" & (5 + i)) = "часов!"
    Next i
    End Sub  

     
    Сейчас вроде работает, но корректно считает почему-то не для всех сотрудников. У некотрых рабочая неделя длится по 3 -4 часа, хотя судя по входам и выходам это не так. Можете ли посоветовать где ошибка?
     
    И еще макрос считает только час. Как сделать подсчет минут и секунд. Поскольку человек проработавший 45 минут на работе таки был...
     
    И еще не логичнее ли индентифицировать людей по номеру пропуска (в поле Отчество). Отрабатывать по уникальной цифре вроде проще чем по фамилии.
     
     PS Простите если ляпаю глупости

    Всего записей: 2695 | Зарегистр. 12-10-2005 | Отправлено: 13:11 17-12-2009 | Исправлено: JekG, 13:15 17-12-2009
    vlth

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    JekG

    Цитата:
    Немного разобрался с работой макроса

     

    Цитата:
    И еще макрос считает только час. Как сделать подсчет минут и секунд

    asngHours(IntJ) = DateDiff("s", .Cells(intI, 1), .Cells(intI + 1, 1)) / 3600  
    Видимо, не очень разобрались : здесь, в этой строке, если убрать "/3600", получим секунды.
     

    Цитата:
    ВАш вариант не сработал изначально

     
    Вообще код написан в кач-ве примера для обработки файла с представленными данными. Как я понимаю, то был фрагмент, по которому нельзя сделать однозначный вывод об их структуре в полном объёме.
    Для приведённой Вами структуры код - внимание! - работает.
                 

    Цитата:
    И еще не логичнее ли индентифицировать людей по номеру пропуска (в поле Отчество). Отрабатывать по уникальной цифре вроде проще чем по фамилии.

    Согласен. Но как быть с этим:

    Цитата:
    Есть файл Excel в котором снятые с турникетов данные входа - выхода сотрудников офиса. Файл состоит из строк  
    1. Фамилия  
    2. Дата и время события  
    3. Направление (вход выход)  
    4. Остальные столбцы не информативны

    Вы предлагаете участникам форума искать чёрную кошку в тёмной комнате? - Ваша задача - правильно сформулировать вопрос, снабдив его исчерпывающей информацией. Труд? - согласен. Но Вы ведь хотите получить ответ?

    Всего записей: 258 | Зарегистр. 22-01-2008 | Отправлено: 15:24 17-12-2009
    mrdime



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Господа!
    Есть необходимость каждый день 5-6 файлов в формате Excel 2003 переформатировать в формат Excel 2007. Это уже надоело. Надо бы сделать макрос который все файлы с расширением .xls из данной папки пересохранит в формат .xlsx. При этом исходные файлы можно удалить. Функций, котрые за это отвечают я толком не знаю. Буду благодарен за советы.

    Всего записей: 2975 | Зарегистр. 04-01-2005 | Отправлено: 15:57 17-12-2009
    JekG

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vlth
    Простите я ни в коем случае не пытался наезжать и обвинять. За помощь благодарю еще раз.
    Если
    Цитата:
    здесь, в этой строке, если убрать "/3600"  

    Получили секунды а нужно, чч.мм.сс. И то посчитало почемуто только нескольких людей. У остальных выдало Overflow.  
    Насчет вводных уточняю -  
    С турникетов выгружаются  
    Файл состоит из строк  
    1. Статус  
    2. Дата и время события
    3. № пр-ка  
    4. Тип пропуска (неинформативное)
    5. Фамилия  
    6. Имя
    7. Отчество (в этом поле прописан номер пропуска сотрудника. Он уникален для каждого и может служить для идентификации в случае одинаковой фамилии)
    8. Отдел
    9. Точка (неинформативное)
    10. Направление (вход выход)  
    11. Зоны (неинформативное)
     
    Так будет совсем точно. Отбирать можно по пп 3 или 7 (они уникальные для каждого)
    Простите еще раз за это недоразумение.

    Всего записей: 2695 | Зарегистр. 12-10-2005 | Отправлено: 16:26 17-12-2009 | Исправлено: JekG, 16:27 17-12-2009
    vlth

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    JekG
    Какое недоразумение? - я не сомневаюсь в отсутствии Ваших претензий ко мне: сие было бы... ну, не важно
    Дело в другом: Вы ставите людям задачу, значит должны грамотно её сформулировать. Понятно, что это иногда бывает сложнее, чем её решить, но это - Ваша работа, от качества которой напрямую зависит, получите Вы ожидаемый результат, или нет.
    Вот что я хотел до Вас донести своим ответом.
     
    Вернёмся к процедуре...
     
    1. Я ввёл в Вашу таблицу две строки, на что программка отреагировала ответом:

    Код:
     
    07.12.09 9:00:00        Клочкова
    07.12.09 9:45:00        Клочкова
     
    Результат:
    Клочкова, неделя 50: 00 ч. 45 мин.

    Как видите, суммарное время меньше часа учитывается.
     
    2.
    Цитата:
    Если  
    Цитата:здесь, в этой строке, если убрать "/3600"  
     
    Получили секунды а нужно, чч.мм.сс.

     
    Имелась ввиду именно эта строка. Если Вы хотите далее оперировать секундами, код ниже неё, скорее всего, нужно тоже модифицировать (я не проверял, но предполагаю, что необходимость этого более чем велика)
     
    3.

    Цитата:
    но корректно считает почему-то не для всех сотрудников

    Возможно, после фамилий в таблице кое-где могут быть пробелы. Чтобы это обойти, необходимо воспользоваться функцией Trim (или RTrim).
    Я не стал её вводить, оставив эту работу Вам.  
     
    4. Я так и не понял, данные в таблице отсортированы по сотрудникам или нет?
     
    Добавлено:
    mrdime
    В пересохраняемых книгах есть какие-либо вещи, приводящие при конвертации в книги Excel 2007 к появлению разного рода сообщений (макросы и т.д.)?

    Всего записей: 258 | Зарегистр. 22-01-2008 | Отправлено: 20:09 17-12-2009
    Igor_Paseka



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Есть форма. На ней есть TextBox. Как сделать что-бы текст в TextBox стал гиперссылкой на конкретный файл. Желательно что-бы все это делалось на форме.
    Спасибо!

    Всего записей: 23 | Зарегистр. 05-05-2009 | Отправлено: 22:47 17-12-2009
    vlth

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    JekG
    Посмотрел Вашу доработку. Кажется, я понял, почему у Вас моя процедурка "не сработала изначально": Вы, наверное, не догадались заглянуть в окно отладки, куда я для примера вывел результаты. Это окно Immadiate редактора VBE. Сделайте его видимым (пункт View строки меню -> Immadiate Window (Ctrl+G) ) и сравните то, что выводится туда, со значениями, которые Вы помещаете в ячейках справа от таблицы.
     
    P.S. А зачем такой большой массив fam на 1000 мест? У Вас столько сотрудников?
    Кстати, поскольку Вы не указали в разделе объявлений Option base 1, первый элемент массива fam(0) всегда равен пустой строке ("").
    И ещё. Все остальные переменные в процедуре test(), поскольку им не присвоен явный тип, воспринимаются VBA как variant, что также не есть рационально.

    Всего записей: 258 | Зарегистр. 22-01-2008 | Отправлено: 01:58 18-12-2009 | Исправлено: vlth, 02:00 18-12-2009
    JekG

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vlth
     
    Скрипт переписали. Теперь отбираем не по фамилии а по номеру пропуска.  
     

    Код:
    Option Explicit
    Function prcEmplJobTimeCount(strSName As String)
    Dim intI As Integer
    Dim i
     
    Sheets(1).Activate
    Dim n1, endn, suma
    n1 = 1
    While Val(Range("C" & (n1 + 4))) <> Val(strSName)
     n1 = n1 + 1
    Wend
        intI = n1
        While Range("H" & (n1 + 4)) = "Выход"
          Rows(n1 + 4).Select
          Selection.Delete Shift:=xlUp
        Wend
        Do While Val(Cells(intI + 4, 3)) = Val(strSName)
            intI = intI + 1
        Loop
        endn = intI - 1
       suma = 0
       For i = n1 To endn
         suma = suma + Minute(Cells(4 + i + 1, 2)) - Minute(Cells(4 + i, 2)) + (Hour(Cells(4 + i + 1, 2)) - Hour(Cells(4 + i, 2))) * 60
         i = i + 1
       Next i
       prcEmplJobTimeCount = suma
    End Function
     
    Sub Test()
    Dim s, n, j, i, b, fam(2, 1000) As String
     
    n = 1
    fam(1, 1) = Range("C5")
    fam(2, 1) = Range("D5")
    i = 5
    While Range("C" & i) <> ""
     
    1 If Range("H" & i) = Range("H" & (i + 1)) Then
        Rows(i + 1).Select
        Selection.Delete Shift:=xlUp
        GoTo 1
    End If
     b = False
     For j = 1 To n
      If Range("C" & i) = fam(1, j) Then
       b = True
      End If
     Next j
     If Not b Then
      n = n + 1
      fam(1, n) = Range("C" & i)
      fam(2, n) = Range("D" & i)
     End If
     i = i + 1
    Wend
        Range("K5:M1663").Select
        Selection.ClearContents
    For i = 1 To n
    s = prcEmplJobTimeCount(fam(1, i))
     Range("K" & (5 + i)) = fam(1, i) + " " + fam(2, i) + " проработал(а): "
     Range("L" & (5 + i)) = s
     Range("M" & (5 + i)) = "минут!"
     Range("N" & (5 + i)) = "="
     Range("O" & (5 + i)) = s \ 60
     Range("P" & (5 + i)) = "часов"
     Range("Q" & (5 + i)) = s - (s \ 60) * 60
     Range("R" & (5 + i)) = "Минут"
    Next i
    End Sub

     
    Что скажете? Есть ошибки? Что либо можно оптимизировать или все уже более мение нормально?

    Всего записей: 2695 | Зарегистр. 12-10-2005 | Отправлено: 17:41 19-12-2009 | Исправлено: JekG, 19:17 19-12-2009
    vlth

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    JekG
    Ммда... Дело хозяйское, конечно. Тем более, если и результат Вас устраивает.
    Только обратите внимание, что Ваша программа считает суммарное отработанное сотрудником время без разбиения его по неделям. Может быть, конечно, это связано с тем, что в таблице данных больше, чем за одну неделю не бывает... - Вы этого не уточняли...

    Всего записей: 258 | Зарегистр. 22-01-2008 | Отправлено: 02:25 20-12-2009
    JekG

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vlth
    Обьясните причины скепсиса.

    Всего записей: 2695 | Зарегистр. 12-10-2005 | Отправлено: 12:48 20-12-2009
       

    Страницы: 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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA (часть 2)
    ShIvADeSt (11-01-2010 10:17): http://forum.ru-board.com/topic.cgi?forum=33&topic=10903


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru