Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
автозакрытие Excel
 
Юрий, оформление исправил.

Такие извращения, что бы вытащить имя листа из книги, т.к. в каждом файле 1 лист, который может называться как угодно. Для написания более "красивого" кода моих познаний в VBA не хватает )
Кстати, винда стала вырубать Excel после того как я добавил в код открытие/закрытие файла для извлечения имени листа. При обращении к файлу с известным именем листа макрос отрабатывает нормально. А как вытащить из закрытого файла имя листа я не нашел (
автозакрытие Excel
 
Не помогло (((

Сам код выглядит так, если нужно...
Код
Public Sub Сбор_данных()

Dim Расчет As Workbook
Dim Файл As String
Dim Путь As String
Dim vData As String

Application.DisplayAlerts = False
Application.ScreenUpdating = False

FilesToOpen = Application.GetOpenFilename("Файлы Excel (*.xls), *.xls", , , , True)

Число_Файлов = UBound(FilesToOpen)

For i = 1 To Число_Файлов
    Файл = Dir(FilesToOpen(i), 7)
    Путь = Mid(FilesToOpen(i), 1, Len(FilesToOpen(i)) - Len(Файл))
    
    Set Расчет = Workbooks.Open(Filename:=FilesToOpen(i), UpdateLinks:=False, ReadOnly:=True)
    vData = Расчет.Sheets(1).Name
    Расчет.Close SaveChanges:=False

    With Worksheets("Свод")
        .Cells(i + 4, 1) = GetValue(Путь, Файл, vData, "C7")
    End With
    If i Mod 10 = 0 Then
        OpenForms = DoEvents
    End If
    
Next i

Application.DisplayAlerts = True
Application.ScreenUpdating = True

End Sub

Private Function GetValue(Путь As String, Файл As String, Лист As String, Ячейка As String)
    GetValue = ExecuteExcel4Macro("'" & Путь & "[" & Файл & "]" & Лист & "'!" & Range(Ячейка).Range("a1").Address(, , xlR1C1))
End Function
Изменено: Алексей Миргородский - 09.12.2014 09:21:44
автозакрытие Excel
 
Доброго времени суток!

Столкнулся со следующей проблемой: написал макрос для пакетной обработки данных в куче Excel-файлов, но через примерно 30 сек. его работы винда (Win 7) вырубает Exel как зависшее приложение, т.к. оно не отвечает.
Не много поковыряв интернет понимаю, что отключать эту функцию винды нельзя. Подскажите, пожалуйста, как исправить проблему средствами Excel?
Локальные переменные
 
Понятно, большое спасибо!
Локальные переменные
 
Я так понимаю ByVal нужно писать перед каждой переменной? И еще вопрос: это нормально, что время выполнения макроса увеличилось раза в 2?

hhh = a * b - не проще, т.к. данный код я привел для примера, а на самом деле у меня макроса листов на 10 и со сложной математикой ))
Локальные переменные
 
Доброго време суток!
Есть 2 функции, одна вызывается из другой. Функции в разных модулях.
Код
Модуль 1:
Sub ggg()
   Dim a0, b0, c0, d0 As Single
   a0 = 5
   b0 = 10
   d0 = hhh(a0, b0)
End Sub

Модуль 2:
Код
Public Function hhh(a, b)
   a = a * b
   hhh= a
End Function

Функция ggg() является основной, в процессе ее выполнения переменной a0 присваивается какое-то значение, после вызова "вспомогательной" функции значение a0 меняется. Подскажите, пожалуйста, как сделать чтобы этого не происходило?
Автовычисление некоторых формул не работает
 
Спасибо большое!
Автовычисление некоторых формул не работает
 
Доброго времени суток!  
 
При двойном клике на "+" в первом столбце листа "МХ" появляется ЮзерФорм, кнопка "Добавить" - добавляет на листы "МХ" и "Удельные" новые строки с формулами. На листе "Удельные" в столбце "I" забита пользовательская функция, которая автоматически не пересчитывается, например, при изменении температуры на листе "Температуры" (ячейки "G6", "H6").  
А вот почему так происходит я понять не могу (
Оформление таблицы макросом
 
УРА, заработало!!!  
Просто у меня оформление таблицы очень сильно зависит от результатов расчетов....    
Спасибо за помощь!
Оформление таблицы макросом
 
без .Activate    
)))
Оформление таблицы макросом
 
при двойной записи with на данном примере помогло )  
 
Подскажите еще как сделать тоже в этом месте (вызывается из модуля UserForm):  
With Лист2  
   .Activate  
   .Rows(i).Insert Shift:=xlDown  
   'Оформление  
   .Range(Cells(i, 1), Cells(i + 1, 1)).Merge  
   .Cells(i, 1).VerticalAlignment = xlCenter  
   .Cells(i, 1).NumberFormat = ";"  
'и так далее  
End With  
Причем из модуля UserForm к Листу 1 все применяется без проблем
Оформление таблицы макросом
 
Макрос запускается по двойному клику на "Х" в последней строке первого столбца
Оформление таблицы макросом
 
Доброго времени суток!  
В модуле листа 1 записано:  
With Лист1.Range(Cells(i - 1, 2), Cells(i - 1, 11)).Borders(xlEdgeBottom)  
   .LineStyle = xlDouble  
   .Weight = xlThick  
   .ColorIndex = xlAutomatic  
End With  
Лист2.Activate  
With Лист2.Range(Cells(i - 1, 1), Cells(i - 1, 9)).Borders(xlEdgeBottom)  
   .LineStyle = xlDouble  
   .Weight = xlThick  
   .ColorIndex = xlAutomatic  
End With  
Лист1.Activate  
Все работает, все оформлено как надо.  
А если убрать .Activate, то выдает ошибку на строке With Лист2...  
Как можно применить оформление к одному листу из модуля другого листа без его .Activate?
Транспонирование массива
 
Спасибо большое!  
Попробую, поэксперементирую...
Транспонирование массива
 
не совсем понял эту запись, а точнее не понял совсем :))  
arr = .Transpose(.Transpose([Лист1!A1:D1+1]))
 
у меня    
mas_T = Application.Transpose(Application.Transpose(Лист1.Range("B8:D8")))  
и из каждого элемента нужно сначала вычесть, ну скажем, 5, и к результату прибавить 15  
А сама функция вызывается с Лист3 в него же записываются результаты вычислений  
 
"Без цикла" я имел ввиду без последовательного перебора через for ... next ...
Транспонирование массива
 
Помогло, спасибо!  
 
А еще вопрос можно?  
1. Можно без цикла уменьшить/увеличить все значения массива на число?  
2. Можно без цикла получить массив состоящий из поэлементной разницы/суммы двух других массивов (естественно равных размеров)?
Транспонирование массива
 
Доброго времени суток!  
Есть массив из одной строки и N столбцов, например  
mas=Лист1.Range("A1:D1")  
нужно сделать так, чтоб к нему можно было обращаться так: mas(i), функция    
mas=Application.Transpose(Лист1.Range("A1:D1")) желаемого результата не дала (получилось mas(i,1))
Где правильно объявить глобальную переменную?
 
Спасибо!  
Может вопрос показался глупым, но программист из меня не особо....  
все равно ОГРОМНОЕ СПАСИБО!!!
Где правильно объявить глобальную переменную?
 
модули разные!  
если так, то выдает ошибку  
 
Public Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)  
 
Public ТипУч As Byte  
 
Dim i As Long  
 
If Target.Cells.Count > 1 Then Exit Sub  
If Not Intersect(Target, Range("A5:A1000")) Is Nothing Then  
   i = Target.Row  
   Select Case Target  
       Case "Х"  
             
       Case "+"  
           UserForm1.Show  
           Select Case ТипУч  
               Case 1  
                   Target.EntireRow.Select  
                   Selection.Insert Shift:=xlDown  
               Case 2  
                     
           End Select  
           Cancel = True  
   End Select  
End If  
 
End Sub
Где правильно объявить глобальную переменную?
 
Доброго времени суток!  
Где правильно объявить глобальную переменную, чтобы значение ей присвоенное в одной процедуре можно было использовать в другой?  
 
Пример прилагается.  
В файле: при двойном клике по ячейке "+" (в первом столбце) отображается ЮзерФорм. При выборе OptionButton1 на листе "МХ" должна добавиться предварительно заполненная строка. На мой взгляд самым оптимальным вариантом связать события BeforeDoubleClick и OptionButton_Change - это глобальная переменная: при событии OptionButton_Change ей присваивается событие, и далее в BeforeDoubleClick идет проверка значения и выполнение действий. Вот только значение переменной не сохраняется (
Копирование строки двумерного массива
 
Пример на листе "Удельные"
Копирование строки двумерного массива
 
Если так  
Dim Mas_Qn()  
Mas_Qn = Worksheets("нормы 1959").Range("B9:D35").Rows(ID_диам).Value  
то  
UBound(Mas_Qn)=1, а должно быть 3!
Копирование строки двумерного массива
 
Доброго времени суток!  
 
Подскажите, пожалуйста, как выделить из двумерного массива строку в одномерный массив не используя последовательный перебор?  
 
Например:    
есть двумерный массив: Worksheets("нормы 1959").Range("B9:D35")  
есть ранее определенный номер строки с необходимыми данными: ID_диам  
необходимо создать одномерный массив Mas_Qn, содержащий строку номер ID_диам двумерного массива  
 
Пробовал конструкцию:  
Dim Mas_Qn(UBound(Mas_T)) As Double  
Mas_Qn = Worksheets("нормы 1959").Range("B9:D35").Rows(ID_диам)  
не работает (
Линейная интерполяция
 
Спасибо за исправленные ошибки. )  
 
PS. Функция ЛИНЕЙН линейную интерполяцию не дает.
Линейная интерполяция
 
Доброго времени суток!  
 
Нужно выполнить линейную интерполяцию/экстраполяцию данных. Для решения сей задачи, в связи с отсутствием готовой функции в Excel, написал функцию, которая отлично работала пока я в нее передавал данные типа double. Сейчас мне нужно использовать ее отдельно от основного макроса и нужно передавать в нее данные с листа (типа Variant). Вот здесь то я и споткнулся...  
 
Все подробности в файле.  
 
Если кто-нить знает как оптимизировать код макроса, подскажите, плз.
Удаление строки по двойному клику на первую ячейку
 
Спасибо за помощь, все работает!
Удаление строки по двойному клику на первую ячейку
 
Прикрепленный выше файл - это фрагмент расчета сети. Если расчет делать на одном листе, то получается слишком широкая таблица (я дошел до столбца BS и это еще не был конец расчета), поэтому для удобства оформления и печати исходных данных, расчета и результатов все разбивается примерно на 10 листов.  
Рассчитываемая сеть состоит из участков, каждый участок это отдельный расчет - строка в файле. А сумма всех строк (участков) в итоговом листе - расчет всей сети. Поэтому на листе исходных данных (Лист "МХ") при добавлении новой строки, например № 7, в строке № 7 на всех листах прописываются необходимые формулы, а при удалении строки №6 - она удаляется на всех листах.  
 
Исходя из моих познаний в Excel, оптимальным вариантом как мне кажется создать на листе "МХ" кнопку по нажатию которой в конец таблицы на всех листах будет добавляться строка с формулами, а при двойном клике на первой ячейке листа "МХ" - будет удаляться. Если у Вас есть идея как сделать эти операции более грамотно - готов выслушать
Удаление строки по двойному клику на первую ячейку
 
Прошу прощения за длительное отсутствие!  
Еще раз выкладываю файл с примером
Удаление строки по двойному клику на первую ячейку
 
Листы с построчно связанными табличами "МХ" и "Удельные", строки которые возможно удалять начинаются с 6. Лист "МХ" является первым (по логике расчета) соответственно только на нем по двойному клику можно удалять строку, при удалении, например, строки 10 автоматически удаляется строка 10 на листе "Удельные". Если по сути, то: при добавлении/удалении строки на листе "МХ" (после шапки таблицы) автоматически тоже самое должно происходить на листе "Удельные". Если есть способ сделать это без дополнительного столбика и двойного клика, подскажите <BR><STRONG>Файл удален</STRONG> - велик размер. [Модераторы]
Удаление строки по двойному клику на первую ячейку
 
Доброго вромени суток!  
 
Есть несколько построчно взаимосвязанных формулами таблиц и возникла необходимость удалить строку с данными, причем для корректности расчетов это нужно делать одновременно на трех листах из книги (всего более 15 листов). Поковырявшись в интернете пришел к выводу, что наилучшый вариант на первом (базовом) листе расчета добавить столбик "А", в котором перед каждой строкой расчета поставить букву "Х" и по двойному клику по ячейке с буквой "Х" столбца "А" удаляется соответствующая строка как на первом листе, так и на двух взаимосвязанных (номера строк совпадают). Получился следующий макрос:  
 
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)  
If Target.Cells.Count > 1 Then Exit Sub  
If Not Intersect(Target, Range("A1:A100")) Is Nothing Then  
   Target.Rows.Delete  
End If  
End Sub  
 
Данный макрос удаляет по двойному клику любую ячейку в диапазоне "А1:А100".  
Как добавить к нему фильтр по содержанию ячейки (я не понял, а точнее у меня не получилось)?  
И еще как заставить макрос удалять строки на других листах?
Страницы: 1
Наверх