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

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

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

ShIvADeSt (23-04-2007 01:59): http://forum.ru-board.com/topic.cgi?forum=33&topic=8273  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

RUSmafia



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

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

 
Обратите внимание, этот топик для помощи в изучении и использовании VBA. Посему запросы типа "Напишите мне такой-то макрос, я VBA не знаю и знать не хочу" не приветствуются.
Древняя мудрость: "Накорми голодного рыбой и он погибнет, научи его ловить рыбу и ты спасешь его."(R)
 
Информация общего характера:
  • Список соответствия имен функций в английской и русской версиях Excel
  • Описание Microsoft Excel File Format
     
    Рекомендации:
    Если у Вас есть проблема, не решаемая стандартными средствами 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.
     
    Родственные топики:
  • Вопросы по работе с MS Excel - Excel FAQ - часть 1, часть 2
  • Технические проблемы с MS Office 2003 или Office XP.
  • Word VBA все вопросы по Word VBA туда
  • Access все вопросы по программированию в Access туда
  • Книжульки по VBA - книги по программированию с использованием VBA
     
    Конкретные вопросы:
    Форма-заставка
    Как запустить макрос при изменении положения курсора или значения ячейки
  • Пример 1
  • Пример 2
  • Пример 3 (проверка области)
  • Пример 4
  • Пример 5
    Зацикливание в функции Change или SelectionChange
     
    Ранжирование без пробелов (макрос включает функции сортировки массива и удаления дубликатов, работает и в Excel 2007)
  • под Office 97
     
    Добавление в главное меню своего пункта, ассоциированного с макросом
    Создание ярлыка на рабочем столе
    Снятие защиты листа при забытом пароле
    Смена раскладки клавиатуры
    Скролл формы колесом прокрутки мыши
    Оптимизация кода по быстродействию использованием массивов

  • Всего записей: 556 | Зарегистр. 31-07-2002 | Отправлено: 21:40 14-10-2004 | Исправлено: lucky_Luk, 20:44 13-04-2007
    alin



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    The okk
    Не выходит каменный цветок.… Предлагает сразу ввести имя нового листа.
    Может я, не правильно написал вопрос?
    PS: На рабочем листе имеется кнопка при нажатии, на которую появляется форма с предупреждением: «Создание нового листа!», на ней две кнопки «Отмена» (закрывает форму) и «ОК»:

    Код:
    Private Sub OK_Click()  
    Dim strDate As String  
    strDate = Format(Now(), "dd.mm")  
    If Sheets(1).Name <> strDate Then  
    ActiveSheet.Copy Before:=Sheets(1)  
    Sheets(1).Select  
    Sheets(1).Name = strDate  
    End If  
    Sheets(1).Select  
    Sheets(1).Name = strDate  
    Range("F3:AD25", "F27:AD31").ClearContents  
    Unload Me  
    End Sub

    Если запустить этот макрос до 00:00ч - удаляются данные текущего дня, если запустить после 00:00 – все нормально. Необходимо исключить удаление данных и создание нового листа, если новые сутки еще не наступили.

    Всего записей: 683 | Зарегистр. 05-08-2004 | Отправлено: 13:55 24-01-2007
    The okk



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

    Цитата:
    Предлагает сразу ввести имя нового листа.

    А что требуется? Ну, не хочешь вводить имя листа, тогда убери вообще строчку  
    strDate = MsgBox и поставь вместо нее Exit Sub.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 14:33 24-01-2007
    alin



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

    Цитата:
    strDate = MsgBox и поставь вместо нее Exit Sub

    Удаляются данные текущего дня (strDate = Format(Now(), "dd.mm")).
    Тоже происходит если не ввести имя листа и нажать Сancel.

    Всего записей: 683 | Зарегистр. 05-08-2004 | Отправлено: 16:33 24-01-2007 | Исправлено: alin, 16:40 24-01-2007
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    alin
    Пропиши лист перед Range.
     
     
    Добавлено:
    A какой код на Cancel?

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 17:14 24-01-2007
    alin



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

    Цитата:
    A какой код на Cancel?

    Подробнее...

    Цитата:
    Пропиши лист перед Range.

    Как это сделать? Я очень плохо разбираюсь в VBA.
     
     

    Всего записей: 683 | Зарегистр. 05-08-2004 | Отправлено: 17:37 24-01-2007 | Исправлено: alin, 17:46 24-01-2007
    Pantera3587

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Спасибо за функцию. Сначала не заработала, но потом все-таки заработала. Классная штука.
     
    SERGE_BLIZNUK
    Зря грешишь на свою программку. У меня работает превосходно. Попоробовала применить для другой таблицы, где больше столбцов, классно работает и быстро. Спасибо за помощь. Теперь буду разбираться с ней. Только объясни, пожайлуста (т.к. может я неправильно понимаю значение), значение вот этих операторов:
     
    KhourRow1 и  found

    Всего записей: 40 | Зарегистр. 20-10-2006 | Отправлено: 18:56 24-01-2007
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    alin
    Как я понял, кнопка Cancel должна просто закрыть форму.
    Код:
    UnloadMe


    Цитата:
    Пропиши лист перед Range.
    Как это сделать?

    Например, так:
    Код:
    Sheets(1).Range("F3:AD25", "F27:AD31").ClearContents

     
    Покажи код, что у тебя получается. Так трудно ошибку найти.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 19:50 24-01-2007 | Исправлено: Yuk, 19:52 24-01-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Pantera3587
    Цитата:
    У меня работает превосходно
    ну значит не зря писал...
    Цитата:
    KhourRow1 и  found
    ты неправильно выразилась - это не операторы, это - Переменные (variables) туда мы заносим какие-то значения, потом их используем
    KhourRow1 - туда заносится номер первой используемой строки на листе w2 (КолЧас)
    скорее всего - у вас это будет 1
    KhourRow2 - количесвто заполненных строк на листе w2
    Эти переменные нужны для организации цикла по всем строкам в листе w2 (для поиска)
    found - это переменная, в которую заносится ИСТИНА (True) если мы нашли соответствие для переносимых в данны момент данных с листа w1(ЗП)
    Если в ней ЛОЖЬ (False) - значит кол-во часов не найдено...

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 20:29 24-01-2007
    alin



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Такая вот проблема.
    The okk Предложил свой вариант.  
    Кнопка Cancel присутствует в InputBox. Дело в том что этот вариант не корректно работает.

    Всего записей: 683 | Зарегистр. 05-08-2004 | Отправлено: 21:15 24-01-2007 | Исправлено: alin, 21:26 24-01-2007
    alin



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Огромное спасибо! Подправил код по Вашей рекомендации, теперь, если лист с именем «dd.mm» существует и запустить макрос, то ничего не происходит:

    Код:
    Private Sub OK_Click()' - создания листа на новые сутки.
    Dim strDate As String
    strDate = Format(Now(), "dd.mm")
    If Sheets(1).Name <> strDate Then
    ActiveSheet.Copy Before:=Sheets(1)
    Sheets(1).Range("F3:AD25", "F27:AD31").ClearContents
    Sheets(1).Name = strDate
    End If
    Unload Me    
    End Sub

    Если можно, помогите сформировать макрос такого плана: в 01:58:00ч планировщик WinXP открывает книгу и на рабочий лист заносятся данные (Macros1), книга закрывается. Какой код необходимо добавить перед Macros1, для того, чтобы лист на новые сутки сам автоматически сформировался, если пользователь забыл это сделать?
    PS:Будет ли корректным код, если добавить перед Macros1 эту часть:

    Код:
    Private Sub OK_Click()
    Dim strDate As String
    strDate = Format(Now(), "dd.mm")
    If Sheets(1).Name <> strDate Then
    ActiveSheet.Copy Before:=Sheets(1)
    Sheets(1).Range("F3:AD25", "F27:AD31").ClearContents
    Sheets(1).Name = strDate
    End If

    Всего записей: 683 | Зарегистр. 05-08-2004 | Отправлено: 09:21 25-01-2007 | Исправлено: alin, 09:24 25-01-2007
    ViktorA



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите советом плиз.
    Есть задачка: MS Excel 97, кропотливо выстроен вид анкеты, предназначенной для последующего сканирования, распознавания, необходимо обработать события нажатия клавиш так, чтобы в текущую ячейку попал 1 й символ и курсор перешел в следующую ячейку, дошел до крайности, не смог решить проще, никак не пойму как обработать event нажатия клавиши е сли нет объекта управления, нашел код управления через API:  
    '***************************************************************************
    '*                                                                         *
    '* MODULE NAME:     CHECK KEYBOARD BUFFER                                  *
    '*                                                                         *
    '* AUTHOR & DATE:   STEPHEN BULLEN,  Stephen@oaltd.co.uk                   *
    '*                                                                         *
    '* DESCRIPTION:     This module contains an example of using Windows API   *
    '*                  calls to check the state of the message buffer.  The   *
    '*                  example includes a check for "Key down" events, which  *
    '*                  are used to stop a loop.  The module contains functions*
    '*                  for both 16-bit and 32-bit versions of Windows.        *
    '*                                                                         *
    '***************************************************************************
     
    Option Base 1
    Option Explicit
     
    '********************************************************************
    '* DECLARE WINDOWS 16-BIT API CALLS                                 *
    '********************************************************************
     
    'Type to hold the x and y coordinates of the mouse pointer
    Type POINTAPI16
        x As Integer
        y As Integer
    End Type
     
    'Type to hold the Windows message information
    Type MSG16
        hWnd As Integer     'the window handle of the app
        message As Integer  'the type of message (e.g. keydown, keyup etc)
        wParam As Integer   'stores the key code
        lParam As Long      '?
        time As Long        'time when message posted
        pt As POINTAPI16    'coordinate of mouse pointer when messahe posted
    End Type
     
    'Find the window handle for this instance of Excel
    Declare Function FindWindow16 Lib "User" Alias "FindWindow" (ByVal lpClassName As String, _
        ByVal lpWindowName As String) As Integer
     
    'Look in the message buffer for a message
    Declare Function PeekMessage16 Lib "User" Alias "PeekMessage" (lpMsg As MSG16, _
        ByVal hWnd As Integer, ByVal wMsgFilterMin As Integer, ByVal wMsgFilterMax As Integer, _
        ByVal wRemoveMsg As Integer) As Integer
     
    'Translate the message from a virtual key code to a ASCII code
    Declare Function TranslateMessage16 Lib "User" Alias "TranslateMessage" (lpMsg As MSG16) As Integer
     
     
    '********************************************************************
    '* DECLARE WINDOWS 32-BIT API CALLS                                 *
    '********************************************************************
     
    'Type to hold the x and y coordinates of the mouse pointer
    Type POINTAPI32
        x As Long
        y As Long
    End Type
     
    'Type to hold the Windows message information
    Type MSG32
        hWnd As Long        'the window handle of the app
        message As Long     'the type of message (e.g. keydown, keyup etc)
        wParam As Long      'stores the key code
        lParam As Long      '?
        time As Long        'time when message posted
        pt As POINTAPI32    'coordinate of mouse pointer when messahe posted
    End Type
     
    'Find the window handle for this instance of Excel
    Declare Function FindWindow32 Lib "USER32" Alias "FindWindowA" (ByVal lpClassName As String, _
        ByVal lpWindowName As String) As Long
     
    'Look in the message buffer for a message
    Declare Function PeekMessage32 Lib "USER32" Alias "PeekMessageA" (lpMsg As MSG32, _
        ByVal hWnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long, _
        ByVal wRemoveMsg As Long) As Long
     
    'Translate the message from a virtual key code to a ASCII code
    Declare Function TranslateMessage32 Lib "USER32" Alias "TranslateMessage" (lpMsg As MSG32) As Long
     
     
    '********************************************************************
    '* Demo procedure to test the keyboard checking function            *
    '********************************************************************
     
    Sub procTestKey()
     
    Dim iCount As Integer
    Dim sKey As String
     
    Application.DisplayStatusBar = True
     
    iCount = 0
     
    While sKey <> ""
    'Just loop until a key is pressed
    Do
        'iCount = iCount + 1
        'Application.StatusBar = "Loop: " & iCount & "  Press any key to stop."
        Application.StatusBar = "Режим ввода данных, для окончания нажмите Esc."
     
        '******************************************
        '*         INSERT YOUR CODE HERE          *
        '******************************************
     
        'Call the appropriate routine to check the keyboard buffer
        If InStr(1, Application.OperatingSystem, "32") = 0 Then
            sKey = funCheckKey16
        Else
            sKey = funCheckKey32
        End If
    Loop Until sKey <> ""
     
    'Display the key pressed
    'MsgBox "You pressed: " & sKey
     
    If sKey <> "" And sKey <> "" And sKey <> "&" And sKey <> "'" And sKey <> "(" And sKey <> "%" And sKey <> "" And sKey <> "" Then 'Esc BackSpase 4Arrows CapsLock Shift
            ActiveCell.Value = sKey
            ActiveCell.Offset(0, 1).Select
    End If
    If sKey = "" Then 'BackSpase
            ActiveCell.Value = " "
            ActiveCell.Offset(0, -1).Select
            ActiveCell.Value = " "
    End If
     
    If sKey = "&" Then 'ArrowUp &
            ActiveCell.Offset(-1, 0).Select
    End If
    If sKey = "'" Then 'ArrowRight '
            ActiveCell.Offset(0, 1).Select
    End If
    If sKey = "(" Then 'ArrowDown (
            ActiveCell.Offset(1, 0).Select
    End If
    If sKey = "%" Then 'ArrowLeft %
            ActiveCell.Offset(0, -1).Select
    End If
     
     
     
     
    Wend
    Application.StatusBar = False
     
    End Sub
     
     
    '***************************************************************************
    '*                                                                         *
    '* FUNCTION NAME:   CHECK KEYBOARD BUFFER - 16 BIT                         *
    '* AUTHOR & DATE:   STEPHEN BULLEN, 9 APRIL 1996                           *
    '*                                                                         *
    '* DESCRIPTION:     This function uses Windows API calls to check if there *
    '*                  are any 'Key down' messages for the application.  If   *
    '*                  there are some, it returns the key pressed as a string *
    '*                                                                         *
    '***************************************************************************
     
    Function funCheckKey16() As String
     
    'Dimension variables
    Dim msgMessage As MSG16
    Dim iHwnd As Integer
    Dim i As Integer
     
    'Dimension Windows API constants
    Const WM_CHAR As Integer = &H102
    Const WM_KEYDOWN As Integer = &H100
    Const PM_REMOVE As Integer = &H1
    Const PM_NOYIELD As Integer = &H2
     
    'Default to no key pressed
    funCheckKey16 = ""
     
    'Get the window handle of this application
    iHwnd = FindWindow16("XLMAIN", Application.Caption)
     
    'See if there are any "Key down" messages
    i = PeekMessage16(msgMessage, iHwnd, WM_KEYDOWN, WM_KEYDOWN, PM_REMOVE + PM_NOYIELD)
     
    'If so ...
    If i <> 0 Then
        '... translate the virtual key code to a character code ...
        i = TranslateMessage16(msgMessage)
         
        '... and get the character code message
        i = PeekMessage16(msgMessage, iHwnd, WM_CHAR, WM_CHAR, PM_REMOVE + PM_NOYIELD)
     
        'Return the character of the key pressed
        funCheckKey16 = Chr(msgMessage.wParam)
    End If
     
    End Function
     
     
    '***************************************************************************
    '*                                                                         *
    '* FUNCTION NAME:   CHECK KEYBOARD BUFFER - 32 BIT                         *
    '* AUTHOR & DATE:   STEPHEN BULLEN, 9 APRIL 1996                           *
    '*                                                                         *
    '* DESCRIPTION:     This function uses Windows API calls to check if there *
    '*                  are any 'Key down' messages for the application.  If   *
    '*                  there are some, it returns the key pressed as a string *
    '*                                                                         *
    '***************************************************************************
     
    Function funCheckKey32() As String
     
    'Dimension variables
    Dim msgMessage As MSG32
    Dim iHwnd As Long
    Dim i As Long
     
    'Dimension Windows API constants
    Const WM_CHAR As Long = &H102
    Const WM_KEYDOWN As Long = &H100
    Const PM_REMOVE As Long = &H1
    Const PM_NOYIELD As Long = &H2
     
    'Default to no key pressed
    funCheckKey32 = ""
     
    'Get the window handle of this application
    iHwnd = FindWindow32("XLMAIN", Application.Caption)
     
    'See if there are any "Key down" messages
    i = PeekMessage32(msgMessage, iHwnd, WM_KEYDOWN, WM_KEYDOWN, PM_REMOVE + PM_NOYIELD)
     
    'If so ...
    If i <> 0 Then
        '... translate the virtual key code to a character code ...
        i = TranslateMessage32(msgMessage)
         
        '... and get the character code message
        i = PeekMessage32(msgMessage, iHwnd, WM_CHAR, WM_CHAR, PM_REMOVE + PM_NOYIELD)
     
        'Return the character of the key pressed
        funCheckKey32 = Chr(msgMessage.wParam)
    End If
     
    End Function
    ___________________________
    работает конечно, но блин неужели нельзя проще?

    Всего записей: 63 | Зарегистр. 20-04-2006 | Отправлено: 17:35 25-01-2007
    Troitsky



    Водник Водкин
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    alin
    Не понимаю к чему тут формы приплели - все вроде на мессаджбоксах легко делается?
    Код:
    Sub Macros1()
      Resp = MsgBox("Создание нового листа. Продолжить?", _
      vbYesNo + vbQuestion, _
      "Создание нового листа")
      If Resp = vbYes Then ' нажимаем "Да"
        strDate = Format(Now(), "dd.mm")
        If Sheets(1).Name <> strDate Then
          ' собственно, создаем лист с таким именем
          ActiveSheet.Copy Before:=Sheets(1)
          Sheets(1).Name = strDate
        Else
          Resp = MsgBox("Лист уже существует! Заполнить лист заново?", _
          vbYesNo + vbExclamation, _
          "Лист уже существует!")
          If Resp = vbNo Then Exit Sub ' нажимаем "Нет"
        End If
        ' заполняем лист
        Sheets(1).Cells(1, 1).Value = Rnd(100)
      Else ' нажимаем "Нет"
        Exit Sub
      End If
    End Sub

    Или я понял задачу неправильно?


    ----------
    Мы в хорошем настроении гуляем по лесам.
    Кто обидеть нас захочет – сам получит по усам.
    Сам полу- получит по усам. Сам полу- получит по усам!

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 18:24 25-01-2007
    alin



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Troitsky
    Вот это да! Класс! Все мои формы полетели...

    Цитата:
    Если можно, помогите сформировать макрос такого плана: в 01:58:00ч планировщик WinXP открывает книгу и на рабочий лист заносятся данные (Macros1), книга закрывается. Какой код необходимо добавить перед Macros1, для того, чтобы лист на новые сутки сам автоматически сформировался, если пользователь забыл это сделать?  
    PS:Будет ли корректным код, если добавить перед Macros1 эту часть:  

    Код:
    Dim strDate As String  
    strDate = Format(Now(), "dd.mm")  
    If Sheets(1).Name <> strDate Then  
    ActiveSheet.Copy Before:=Sheets(1)  
    Sheets(1).Range("F3:AD25", "F27:AD31").ClearContents  
    Sheets(1).Name = strDate  
    End If  

     

     

    Всего записей: 683 | Зарегистр. 05-08-2004 | Отправлено: 08:38 26-01-2007 | Исправлено: alin, 09:06 26-01-2007
    Troitsky



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

    Код:
    Private Sub Workbook_Open()
      Dim strDate As String
      strDate = Format(Now(), "dd.mm")
      If Sheets(1).Name <> strDate Then
        ActiveSheet.Copy Before:=Sheets(1)
        Sheets(1).Name = strDate
        Sheets(1).Range("F3:AD25", "F27:AD31").ClearContents
      End If
      ActiveWorkbook.Close True
    End Sub
    Если процесс создания листа - суть копирование листа за предыдущий день и вставка его первым, а затем переименование и очистка определенных областей.
     
    Но если такой код вешать на событие открытия книги, то в случае ее открытия вручную книга так же будет закрываться. Вопрос в том как отличить автоматическое открытие от ручного?
    Может быть проще копнуть в сторону скрипта на VBScript? кажется на нем можно подобное организовать.


    ----------
    Мы в хорошем настроении гуляем по лесам.
    Кто обидеть нас захочет – сам получит по усам.
    Сам полу- получит по усам. Сам полу- получит по усам!

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 14:15 26-01-2007
    alin



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Troitsky
    Да, новый лист формируется путем копирования старого и очистки области.
    PS: В 01:58:00ч планировщик WinXP открывает книгу 01:58:20ч срабатывает макрос (по времени) данные из одного столбца копируются в другой, книга закрывается. Через каждые два часа планировщик открывает книгу, и макрос, который отрабатывает по времени, копирует данные в нужный столбец. Если я вставлю вышеприведенный код в макрос, который сработает в 01:58:20ч – будет ли он работать корректно в случаях: а) лист создан пользователем; б) лист не создан пользователем?
    Извиняюсь за настойчивость, дело в том, что ночью я редко бываю на работе.

    Всего записей: 683 | Зарегистр. 05-08-2004 | Отправлено: 15:21 26-01-2007 | Исправлено: alin, 15:30 26-01-2007
    Troitsky



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

    Цитата:
    Если я вставлю вышеприведенный код в макрос, который сработает в 01:58:20ч – будет ли он работать корректно в случаях: а) лист создан пользователем; б) лист не создан пользователем?  
    Извиняюсь за настойчивость, дело в том, что ночью я редко бываю на работе.

    А неужели для того, чтобы проверить нужно обязательно ждать до 01:58:20?
     
    По поводу скрипта vbs: можно что-то типа такого использовать:
    Код:
    strDate = Day(Now()) & "." & Month(Now())  
     
    Set objExcel = CreateObject("Excel.Application")
     
    With objExcel
        .Workbooks.Open "test.xls"
        With objExcel.ActiveWorkbook
            If .Sheets(1).Name <> strDate Then  
                .ActiveSheet.Copy .Sheets(1)  
                .Sheets(1).Name = strDate  
                .Sheets(1).Range("F3:AD25", "F27:AD31").ClearContents  
            End If
            .Close True
         End With
    End With
     
    Set objExcel = Nothing
    в этом случае работа с книгой будет происходить из скрипта, а не из макроса: снимается сразу проблема выявления режима, в котором открыта книга (автоматический или ручной), и проблема настройки соответствующего уровня безопасности для макросов.


    ----------
    Мы в хорошем настроении гуляем по лесам.
    Кто обидеть нас захочет – сам получит по усам.
    Сам полу- получит по усам. Сам полу- получит по усам!

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 16:05 26-01-2007
    alin



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

    Цитата:
    По поводу скрипта vbs

    А куда его прикрутить нужно? Если его запустить с макросом, то он предлагает сохранить копию "test.xls" и в файле "Копия test.xls" происходит создание нового листа и очистка области.

    Всего записей: 683 | Зарегистр. 05-08-2004 | Отправлено: 16:49 26-01-2007 | Исправлено: alin, 16:50 26-01-2007
    ViktorA



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Неужели никто не поможет?
     
    Как проще обрабатывать нажатия клавиш при вводе текста в ячейку?

    Всего записей: 63 | Зарегистр. 20-04-2006 | Отправлено: 16:58 26-01-2007 | Исправлено: ViktorA, 17:05 26-01-2007
    Troitsky



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

    Цитата:
    А куда его прикрутить нужно? Если его запустить с макросом, то он предлагает сохранить копию "test.xls" и в файле "Копия test.xls" происходит создание нового листа и очистка области.

    Создай текстовый файл, скопируй туда скрипт, сохрани его с именем бла-бла-бла.vbs. рядом положи книгу test.xls, с которой и будут выполняться операции. запусти файл бла-бла-бла.vbs
     
     
    Добавлено:
    Т.е. в такого типа скрипте ты можешь записать все что хочешь с книгой проделать, не используя макросы. Только планировщик должен не книгу уже запускать, а сам скрипт.


    ----------
    Мы в хорошем настроении гуляем по лесам.
    Кто обидеть нас захочет – сам получит по усам.
    Сам полу- получит по усам. Сам полу- получит по усам!

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 17:05 26-01-2007
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Кому интересно, обратите внимание на новую статью с CITForuma вверху.
    WinApi. Лекция из курса "Основы офисного программирования и язык VBA"
    Очень интересная тема. В шапку.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 17:33 26-01-2007
       

    Страницы: 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

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA
    ShIvADeSt (23-04-2007 01:59): http://forum.ru-board.com/topic.cgi?forum=33&topic=8273


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru