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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    grooogler

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SAS888
    спасибо. работает верно. но видимо мой косяк, я одну деталь не уточнил:
    вот мы когда указываем в листе 2 в столбце А: zyx
    то в результате у нас должны быть все строчки из листа 1 столбца А которые содержат xyz. А сейчас только первое встречающиеся в результат отправляет.
     
    и ещё небольшое уточнение.
    можно ли сделать чтоб в листе результат они выводились не в том порядке в какой строки находятся в Листе 1, а в порядке указания того что мы ищем в Листе 2?
    То есть указали мы в Листе 2, столбце А:
    222
    333
    555
    И в результате сначала будет идти все строки из листа 1, столбца а - 222, потом все 333, потом 555... и т.д.?
     
    вот пример http://slil.ru/26620781

    Всего записей: 38 | Зарегистр. 20-09-2008 | Отправлено: 18:56 05-02-2009 | Исправлено: grooogler, 23:27 05-02-2009
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    grooogler
    Здесь реализован поиск всех совпадающих позиций.
    По поводу сортировки не совсем ясно. Вообще-то должно быть именно так, как Вы написали. Поиск проводится начиная со столбца "A" с первой строки и далее. Берем первое значение, ищем частичные совпадения. При обнаружении, записываем в лист 3 в следующую свободную строку. И т.д. Т.е. именно в таком порядке и будут располагаться данные на результирующем листе. Что не так?

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 05:37 06-02-2009
    Solenaja



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SAS888
    а по моему вопросу ничего не решилось ?

    ----------
    Могу помочь, но только своими знаниями и ...

    Всего записей: 4246 | Зарегистр. 02-09-2001 | Отправлено: 12:30 06-02-2009
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Solenaja
    Посмотрите Здесь. В исходных файлах отсутствуют столбцы "Итог" и "Средняя продажа". Я не понял, они могут быть, могут не быть? В каком случае что делать? Где они могут быть? Если они есть, включать их в обработку?

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 13:38 06-02-2009
    grooogler

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SAS888
    всё отлично. большое спасибо

    Всего записей: 38 | Зарегистр. 20-09-2008 | Отправлено: 15:27 06-02-2009
    frvade

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Нужна помощь.Мне нужно из макроса открыть xml файл с именем,таким же,как у активного xls файла.Пытался ThisWorkbook.Name - выдает полное имя с .xls , а как бы мне его вычленить без окончания?
    Заранее спасибо

    Всего записей: 2 | Зарегистр. 06-02-2009 | Отправлено: 17:31 06-02-2009
    V4mp



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Уважаемые, появилась парочка вопросов.
    Надеюсь, кто-нибудь знает.
     
    1 - нужно при включенной защите книги (защита ТОЛЬКО на изменение структуры) скрывать и отображать листы Excel.
    2 - как запретить обработку сочетания ctrl-break при выполнении макросов.
    3 - может ли excel взаимодействовать с word'ом напрямую - т.е. брать данные с ячейки и забивать их автоматом в ворд и нооборот. Или без внешних файлов не обойтись? (т.е. например excel - файл.TXT - word)
    4 - дурацкий вопрос, но все же... может как-нибудь можно организовать прокрутку в ЯЧЕЙКЕ. т.к. периодически в одну ячейку нужно ввести оч. много данных, которые даже на экран не всегда влезают. Может у кого какие идеи есть, как это организовать?
    5 - и последний. На сколько хватит бедного эксэля при использовании vba? т.е. какой памятью он располагает и не ограничено ли использование глобальных переменных, функций и т.д. Может где-нибудь эту инфу можно почитать?

    Всего записей: 65 | Зарегистр. 04-12-2008 | Отправлено: 17:34 06-02-2009
    frvade

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Прошу прощения,поторопился с вопросом.Решил сам,сделав replace для name.

    Всего записей: 2 | Зарегистр. 06-02-2009 | Отправлено: 17:43 06-02-2009
    V4mp



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

    Цитата:
    Нужна помощь.Мне нужно из макроса открыть xml файл с именем,таким же,как у активного xls файла.Пытался ThisWorkbook.Name - выдает полное имя с .xls , а как бы мне его вычленить без окончания?  
    Заранее спасибо

    Mid(ThisWorkbook.Name, 1, Len(ThisWorkbook.Name) - 4)
     
    Добавлено:

    Всего записей: 65 | Зарегистр. 04-12-2008 | Отправлено: 18:02 06-02-2009
    Solenaja



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SAS888
    >Я не понял, они могут быть, могут не быть? В каком случае что делать? Где они могут быть? Если они есть, включать их в обработку?
    да это к тому, что если тебе долго заморачиваться с кодом макроса чтобы удалить эти столбцы - то можно не делать (на данный момент они "руками удалены"), а оставлять как есть, но желательно за последней неделей размещать два искомых столбца "Макс" и "Макс / 3", тк таблица может состоять из всего нескольких недель, а искомые значения (Макс и Макс / 3) будут очень далеко справа
     
    в общем то что ты сделал - то что нужно, но
    - закрепление области в ячейки С13 не происходит, область закрепляется в других местах, возможно что это из-за Excel 2007. Проверено в 2003 точно также. Закрепление в основном делается на строке 37 и с столбца "P", "R"
    - если можно ещё сделать чтобы background ячеек в столбцах "Макс" и "Макс / 3" был таким же как и у ячеек "столбца B", т.е. если строка белая - то и в столбце "Макс" и "Макс / 3" будет тоже белая ячейка, если серая - соотвественно серая.
    - где-то было, что лучше для округления использовать функцию Format(), вместо ROUND ()

    ----------
    Могу помочь, но только своими знаниями и ...

    Всего записей: 4246 | Зарегистр. 02-09-2001 | Отправлено: 18:14 06-02-2009 | Исправлено: Solenaja, 19:01 06-02-2009
    Lyrik

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

    Всего записей: 388 | Зарегистр. 04-04-2006 | Отправлено: 01:58 07-02-2009
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Solenaja
    Еще раз убеждаемся в том, что чем подробнее будет оговорено задание, тем быстрее и точнее получите ответ.
    Посмотрите Этот вариант. Сделано следующим образом: если в текущем файле встречаются столбцы с заголовками "Итог" и "Средняя продажа" (названия менять нельзя), то они просто удаляются. После расчета, в сформированных столбцах остаются только значения. Формулы в ячейках уничтожаются. Если же Вы хотите оставить формулы - в коде макроса закомментируйте строку
    Код:
    .Value = .Value
    Все остальные Ваши требования попытался удовлетворить. Есть одна деталь: для того, чтобы закрепление областей осуществлялось корректно, пришлось после открытия каждого файла разрешать (всего лишь на время выполнения одной функции) обновление экрана. Устроит?

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 08:06 07-02-2009 | Исправлено: SAS888, 08:07 07-02-2009
    grooogler

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SAS888
    совсем забыл, небольшое дополнение к последнему скрипту нужно.
    Там скрипт фильтрует содержимое первого листа по значениям содержимого второго и найденное показывает в третьем листе. так вот, нужно чтоб в четвертом листе выводилось всё оставшееся. то есть, там должны вывестись те строки листа 1 которые не соответствуют значениям указанным в листе 2.

    Всего записей: 38 | Зарегистр. 20-09-2008 | Отправлено: 10:40 07-02-2009
    zediks

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите пожалуйста как сделать так, чтобы не появлялось сообщение:  
    "Microsoft Office Excel ожидает завершения OLE - операции другим приложением".  
    Оно появляется когда запускается сложный запрос к базе данных из Excel.
    Или как изменить временной интервал, прежде чем оно появится?

    Всего записей: 8 | Зарегистр. 09-08-2007 | Отправлено: 09:35 09-02-2009
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    grooogler
    Посмотрите Здесь. Листы 3 и 4 должны исходно существовать. Макрос их не создает и не проверяет.

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 10:32 09-02-2009
    xellga

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите написать к программе пояснения:
    Public Sub AddMenu()
    Dim comBar      As CommandBar
    Dim comBarBut   As CommandBarButton
    Dim mnuXXX      As CommandBarControl
    Dim  N   As Long
    Dim  ii  As Long
           Set comBar = CommandBars("WorkSheet Menu Bar")
           N = comBar.Controls.Count
           For ii = 1 To N
               If comBar.Controls(ii).Caption = "Matrix" Then Exit Sub
           Next ii
           Set mnuXXX = comBar.Controls.Add(Type:=msoControlPopup, Temporary:=True, Before:=N)
           With mnuXXX
                .Caption = "Matrix"
                With .Controls.Add(Type:=msoControlButton)
                     .Caption = "Generate"
                     .OnAction = "Main"
                End With
                With .Controls.Add(Type:=msoControlButton)
                     .Caption = "Clear"
                     .OnAction = "Clear"
                End With
           End With
    End Sub
     
    Public Sub DelMenu()
    Dim comBar      As CommandBar
    Dim comBarBut   As CommandBarButton
    Dim N   As Long
    Dim ii  As Long
           Set comBar = CommandBars("WorkSheet Menu Bar")
           N = comBar.Controls.Count
           For ii = 1 To N
               If comBar.Controls(ii).Caption = "Matrix" Then
                  comBar.Controls(ii).Delete
                  Exit For
               End If
           Next ii
    End Sub
    ---------------------------------
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Private Const Epsilon  As Double = 0.01
    Private Const ShowMult As Boolean = True
     
    Private Matrix()       As Double
    Private tmpMatrix()    As Double
    Private N              As Long
    Private NewTMatrix()   As Double
    Private TMatrix()      As Double
     
    Private Pi             As Double
    Private Row            As Long
     
    Public Sub Main()
    Dim I As Long
    Dim J As Long
    Dim L As Long
    Dim Amax  As Double
    Dim p     As Double
    Dim CosFi As Double
    Dim SinFi As Double
    Dim IMax  As Long
    Dim JMax  As Long
    Dim Iter  As Long
    Dim pIMax  As Long
    Dim pJMax  As Long
    Dim Tii   As Double
    Dim Tij   As Double
    Dim Tji   As Double
    Dim Tjj   As Double
          Clear
          Randomize (Time)
          Pi = Atn(1)
          N = CLng(InputBox("Введите размерность матрицы." + Chr(10) + "(меньше 20)", "GenerateMatrix", 5))
          If N = 0 Then
             Row = 2
             MyGenerate
             Row = Row + N + 1
          Else
             ReDim Matrix(1 To N, 1 To N) As Double
             ReDim tmpMatrix(1 To N, 1 To N) As Double
             ReDim TMatrix(1 To N, 1 To N) As Double
             'ReDim NewTMatrix(1 To N, 1 To N) As Double
             Row = 2
            'формируем матрицу
             For I = 1 To N
                 For J = 1 To N
                     Matrix(I, J) = Rnd(1) * 20
                 Next J
             Next I
          End If
             Show Row
              ActiveSheet.Range("C" + CStr(Row)).FormulaR1C1 = "Исходная матрица"
            For I = 1 To N
                 For J = 1 To N
                    If (I = J) Or (J = I + 1) Or (J = I - 1) Then Matrix(I, J) = Matrix(I, J) Else Matrix(I, J) = 0
                 Next J
             Next I
          Row = Row + N + 3
            Show Row
          ActiveSheet.Range("C" + CStr(Row)).FormulaR1C1 = "Трехлинейная матрица"
              For I = 1 To N
                 For J = 1 To N - 1
                  L = Abs(Matrix(I, J + 1) - Matrix(I, J))
                  If L = 0 Then L = 1
                  X = Matrix(I, J)
             
            Do While (X <= (Matrix(I, J) + Abs(Matrix(I, J + 1) - Matrix(I, J))))
                  X = X + Epsilon
                  tmpMatrix(I, J) = ((1 - X) / L) * Matrix(I, J) + (X / L) * Matrix(I, J + 1)
                  tmpMatrix(I, J) = X
              Loop
                 Next J
             Next I
     
            For I = 1 To N
                 For J = 1 To N
                    TMatrix(I, 1) = TMatrix(I, 1) + tmpMatrix(I, J)
                 Next J
             Next I
            Row = Row + N + 3
         For R = 1 To N
           C = 1
                ActiveSheet.Cells(R + Row, C + 1).Value = TMatrix(R, C)
          Next R
    End Sub
     
    Public Sub MultMatrix(FirstMatr() As Double, _
                         SecondMatr() As Double, _
                          ResMatrix() As Double)
    Dim I As Long
    Dim J As Long
    Dim K As Long
    Dim R As Double
        ReDim ResMatrix(1 To N, 1 To N) As Double
        'Умножаем матрицу на другую матрицу...
        For J = 1 To N
            For I = 1 To N
                R = 0
                For K = 1 To N
                    R = R + FirstMatr(I, K) * SecondMatr(K, J)  ', K)
                Next K
                If Abs(R) < Epsilon Then R = 0
                ResMatrix(I, J) = R
            Next I
        Next J
    End Sub
     
    Public Sub Transp(InputMatrix() As Double)
    Dim I As Long
    Dim J As Long
        For I = 1 To N
            For J = I + 1 To N
                Swap InputMatrix(I, J), InputMatrix(J, I)
            Next J
        Next I
    End Sub
     
    Public Sub Swap(A As Double, B As Double)
    Dim C As Double
        C = A
        A = B
        B = C
    End Sub
     
    Public Function Sp() As Double
    Dim I   As Long
    Dim Tmp As Double
        Tmp = 0
        For I = 1 To N
            Tmp = Tmp + Matrix(I, I)
        Next I
        Sp = Tmp
    End Function
     
     
    Private Sub Show(Row As Long)
    Dim R      As Long
    Dim C      As Long
        For R = 1 To N
            For C = 1 To N
                ActiveSheet.Cells(R + Row, C + 1).Value = Matrix(R, C)
            Next C
        Next R
    End Sub
     
    Public Sub Clear()
        ActiveSheet.Cells.Select
        Application.CutCopyMode = False
        Selection.ClearContents
        Selection.Interior.ColorIndex = xlNone
        Selection.NumberFormat = "0.0000"
        Selection.ColumnWidth = 9
    End Sub
     
    Private Sub MyGenerate()
    Dim I As Long
    Dim J As Long
    Dim Angle As Double
    Dim CosFi As Double
    Dim SinFi As Double
    Dim IMax  As Long
    Dim JMax  As Long
          N = 10
          ReDim Matrix(1 To N, 1 To N) As Double
          ReDim tmpMatrix(1 To N, 1 To N) As Double
          ReDim TMatrix(1 To N, 1 To N) As Double
          ReDim NewTMatrix(1 To N, 1 To N) As Double
          For I = 1 To N
              For J = 1 To N
                  If I = J Then
                     Matrix(I, J) = CLng(Rnd(1) * 20)
                  Else
                     Matrix(I, J) = 0
                  End If
              Next J
          Next I
          Show Row
          For IMax = 1 To N
              For JMax = IMax + 1 To N
                  For I = 1 To N
                      For J = 1 To N
                          If I = J Then
                             TMatrix(I, J) = 1
                          Else
                             TMatrix(I, J) = 0
                          End If
                      Next J
                  Next I
             
                  Angle = Rnd(1) * 360
                  Angle = Angle * 2 * Pi / 360
                  CosFi = Cos(Angle)
                  SinFi = Sin(Angle)
                  TMatrix(IMax, IMax) = CosFi
                  TMatrix(IMax, JMax) = SinFi
                  TMatrix(JMax, IMax) = -SinFi
                  TMatrix(JMax, JMax) = CosFi
                  MultMatrix TMatrix, Matrix, tmpMatrix
                  Transp TMatrix
                  MultMatrix tmpMatrix, TMatrix, Matrix
              Next JMax
          Next IMax
    End Sub
     
     
     
     

    Всего записей: 3 | Зарегистр. 08-02-2009 | Отправлено: 11:15 09-02-2009
    grooogler

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SAS888
    гуд. ещё раз спасибо!

    Всего записей: 38 | Зарегистр. 20-09-2008 | Отправлено: 12:19 09-02-2009
    Solenaja



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SAS888
    мегареспект !
     
    p.s. >пришлось после открытия каждого файла разрешать (всего лишь на время выполнения одной функции) обновление экрана. Устроит?
    с этим не ясно, рефреш в принципе был и до этого, что замечено, так это чуток медленнее и все.
     
    может быть ещё поправишь вот этот код:

    Код:
    Sub copy_sheets()
     
    Dim arg As String
    Dim i As Integer
    For i = 1 To Sheets.Count
        arg = Sheets(i).Name
        If ActiveWorkbook.Sheets(i).Tab.ColorIndex = 14 Then
           Sheets(Array("СОДЕРЖАНИЕ", "Скидки", _
                arg, "Валюта", "Примечание", "Адрес")).Copy
           ' сохраняю и закрываю книгу
           ChDir "d:\Прайсы\По категориям\..."
           ActiveWorkbook.SaveAs (arg)
           ActiveWorkbook.Close
           ' перехожу к поиску следующего зеленого листа
           Windows("прод.xls").Activate
        End If
    Next
    End Sub

    почему то файлы не сохраняются в d:\Прайсы\По категориям\, а в c:\Users\user1\Мои документы\ и это макрос работает только в Excel 2003, в 2007 не хочет

    ----------
    Могу помочь, но только своими знаниями и ...

    Всего записей: 4246 | Зарегистр. 02-09-2001 | Отправлено: 13:02 09-02-2009 | Исправлено: Solenaja, 15:02 09-02-2009
    NUB01



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Уважаемые эксперты.
    Вопрос связанный с объединенными ячейками: Есть ли простой способ определить в ВБА, какой диапазон ячеек объединен?  

    Всего записей: 19 | Зарегистр. 30-09-2008 | Отправлено: 17:16 09-02-2009
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Solenaja
    Правильно ли я понимаю Ваш код?
    Требуется: по пути "D:\Прайсы\По категориям\"  создать файлы, состоящие из 5 фиксированных листов ("СОДЕРЖАНИЕ", "Скидки", "Валюта", "Примечание", "Адрес"), а так же листа с "зеленым" ярлычком. Имя файла должно совпадать с именем "зеленого" листа. Так?
    Если так, то можно применить следующий макрос:

    Код:
    Sub copy_sheets()
        Dim arg As String, i As Integer, myPath As String
        Application.ScreenUpdating = False
        myPath = "D:\Прайсы\По категориям\" 'Подставьте требуемый путь для сохранения
        For i = 1 To Sheets.Count
            arg = Sheets(i).Name
            If Sheets(i).Tab.ColorIndex = 14 Then
                Sheets(Array("СОДЕРЖАНИЕ", "Скидки", arg, "Валюта", "Примечание", "Адрес")).Copy
                ActiveWorkbook.SaveAs (myPath & arg & ".xls"): ActiveWorkbook.Close
            End If
        Next
    End Sub

    Существование имен фиксированных листов в макросе не проверяется. Если нужно - добавьте такую проверку.
     
    Добавлено:
    NUB01
    Можно, например, с помощью небольшой процедуры.
    Пусть требуется выделить все объединенные ячейки в диапазоне "A1:K30".

    Код:
    Sub DetectMerge()
        Dim y As Range, Cell As Range
        For Each Cell In [A1:K30]
            If Cell.MergeArea.Cells.Count > 1 Then _
                If y Is Nothing Then Set y = Cell.MergeArea Else Set y = Union(y, Cell.MergeArea)
        Next
        If y Is Nothing Then MsgBox "Объединенных ячеек не найдено." Else y.Select
    End Sub

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 08:06 10-02-2009 | Исправлено: SAS888, 09:32 10-02-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