Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Excel VBA (часть 2)

Автор: SERGE_BLIZNUK
Дата сообщения: 07.06.2007 16:41
borann

Цитата:
Хочу в экселе программно сделать "сохранить как..." что бы выскакивало стандартное экселевское окно "Сохранить как..", а в строке "имя файла" стояло составленное из переменных имя. Возможно такое.

решение найденное в данном топике от 12.01.2007
(с) jONES1979

Код:
' берем окончание имени из ячейки b2 (- для примера)
sInitialFileName = "My_file_" & CStr(ActiveSheet.Range("b2").Value)
vReturnedName = Application.GetSaveAsFilename(InitialFileName:=sInitialFileName, _
fileFilter:="excel (*.xls), *.xls")

If vReturnedName <> False Then
Application.EnableEvents = False
ThisWorkbook.SaveAs Filename:=vReturnedName
Application.EnableEvents = True
End If
Автор: Marina1112
Дата сообщения: 08.06.2007 10:13
Здравствуйте! Нужна помощь я программировать не умею. Но мне очень надо сделать задание, которое получила от начальства. Помогите плиз.
Задание следующие. Есть две книги excel. Назовем их «А» и «Б». В книги «А» есть много листов с таблицей. Каждый лист носит название текущего месяца. В книги «Б» один лист с таблицей с такими же графами что и в книги «А». Надо что бы каждый месяц в книги «А» создавался лист с названием текущего месяца и содержал нужную таблицу. И после того как таблица книги «А» будет заполнена в книги «Б» все должно заполница автоматические.
Автор: SERGE_BLIZNUK
Дата сообщения: 08.06.2007 10:32
Marina1112
1) подобное уже на форуме было. Попробуйте поискать...

2)
Цитата:
Есть две книги excel. Назовем их «А» и «Б».
лучше всего, если Вы выложите Ваши книги (с нужными таблицами), тем более, что Вы -
Цитата:
я программировать не умею
Как неоднократно показывал опыт - это самый короткий путь к решению достаточно сложных задач - те, кто умеет программировать - смогут Вам помочь (а не угадывать телепатически, что Вы хотели, а потом на пальцах не надо объяснять, как это сделать ;-)))

и ещё, а что должно произвойти в январе следующего года с книгой "А"? (уже 12 листов по месяцам будет создано)

Автор: zayakin
Дата сообщения: 08.06.2007 11:52
работа с OLAP
исходное:
ActiveSheet.PivotTables("xxx").PivotFields("[xxx]"). _
AddPageItem "[" & Day(Range("nowdate").Value) & "]", _
True
надо чтобы указывалось не одно значение, а несколько. при записи макроса выдается такой текст (я убрал часть, чтобы внимание не сбивать):
With ActiveSheet.PivotTables("xxx").PivotFields("[xxx]")
.AddPageItem "[1]", True
.AddPageItem "[2]"
.AddPageItem "[3]"
.AddPageItem "[4]"
.AddPageItem "[5]"
.AddPageItem "[6]"
End With
я не знаю как сформировать в цикле от даты от 1-го числа месяца до желаемого дня запрос к таблице. т.е. если я запрашиваю за 5-е число, то генерится текст для запроса 5-ти дней, если 25 - то за 25.
Автор: Oyger
Дата сообщения: 08.06.2007 12:10
Marina1112

Если Вы программировать не умеете, то вашу задачу Вы можете и ручками решить:
Открываете книгу "А". В новый месяц создаете копию листа с нужной таблицей в этой же книге. Переименовываете скопированный лист как Вам надо. Очищаете от содержимого (если требуется). За месяц Вы его заполняете (из вашего пояснения понятно, что вы его и так будете в ручную заполнять). По окончании месяца Вы его копируете в книгу "Б". Если требуется - очищаете от ссылок. Вот и все. Делов - меньше полминуты.
Или Вы о таких возможностях Excel'я не знаете???
Автор: i1k
Дата сообщения: 08.06.2007 13:17
SERGE_BLIZNUK
ну ВСЕ галочки там не снять ..
Формы, ВБА и сама экселевская библиотеки в работе, а потому на них стоит запрет на снятие

Но вот сама идея...5+
Опробовал. Отключил нафиг только вордовскую библиотеку.
И заменил символьные константы типа wdGoToBookmark на их числовое значение. И тестовый кусок макроса у меня отработал!
Теперь буду проверять на предмет скрытых ошибок. Может эти константы меняются от версии к версии
Спасибо. Поработаю в этом направлении.
Автор: GFSGF
Дата сообщения: 08.06.2007 19:07
Добрый вечер.Вопрос наверное покажется вам тупым.У меня есть макрос . Доступ к коду этого макроса закрыт паролем.Я знаю лишь название макроса.Как мне синтаксически правильно использовать запуск этого макроса по его имени в своих кодах. Я имею ввиду не присвоение кнопке имени макроса, а использовать его в программе.Допустим имя макроса "Макрос 1".
Автор: Planus
Дата сообщения: 08.06.2007 23:49
Здравствуйте!
VBA только начал изучать, поэтому обращаюсь за помощью.
Требуется создать пользовательскую функцию.
Имеется рабочий лист с массивом данных, точнее 1 столбец.
Text1 =Function(Text1) возвращаемое значение "4"
Number1 =Function(Number1) возвращаемое значение, например, "0"
Number2 =Function(Number2) возвращаемое значение, например, "0"
Number3 =Function(Number3) возвращаемое значение, например, "0"
Number4 =Function(Number4) возвращаемое значение, например, "0"
Text2 =Function(Text1) возвращаемое значение "3"
Number1 =Function(Number1) возвращаемое значение, например, "0"
Number2 =Function(Number2) возвращаемое значение, например, "0"
Number3 =Function(Number3) возвращаемое значение, например, "0"
Текст и числа произвольные.
Функция ссылается на ячейку с текстом (в том же рядке) и возвращает кол-во значений что расположились под ячейкой с текстом (в данном примере это будет 4 и 3), далее добравшись до первой ячейки содержающей текст, подсчет прекращается. При ссылке на ячейку с числом пускай возвращается нуль.
Поковырявшись, кажется нужно как то использовать WorksheetFunction.IsText() и WorksheetFunction.CountIf(), но как всё это организовать не знаю. Так же догадываюсь, что это наверняка можно решить и без VBA, но в целях образовательных...
Большое спасибо за помощь!
Автор: AndVGri
Дата сообщения: 09.06.2007 05:11
GFSGF
Надеюсь, под макросом подразумевается процедура или функция? Тогда вот что поэтому поводу говорит [more=Help]
Run Method
Applies To Application Range

Specifics Run method as it applies to the Range object.

Runs the Microsoft Excel macro at this location. The range must be on a macro sheet.

expression.Run(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10, Arg11, Arg12, Arg13, Arg14, Arg15, Arg16, Arg17, Arg18, Arg19, Arg20, Arg21, Arg22, Arg23, Arg24, Arg25, Arg26, Arg27, Arg28, Arg29, Arg30)
expression Required. An expression that returns a Range object.

Arg1-Arg30 Optional Variant. The arguments that should be passed to the function.

Run method as it applies to the Application object.

Runs a macro or calls a function. This can be used to run a macro written in Visual Basic or the Microsoft Excel macro language, or to run a function in a DLL or XLL.

expression.Run(Macro, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10, Arg11, Arg12, Arg13, Arg14, Arg15, Arg16, Arg17, Arg18, Arg19, Arg20, Arg21, Arg22, Arg23, Arg24, Arg25, Arg26, Arg27, Arg28, Arg29, Arg30)
expression Required. An expression that returns an Application object.

Macro Optional Variant. The macro to run. This can be either a string with the macro name, a Range object indicating where the function is, or a register ID for a registered DLL (XLL) function. If a string is used, the string will be evaluated in the context of the active sheet.

Arg1-Arg30 Optional Variant. The arguments that should be passed to the function.

Remarks
You cannot use named arguments with this method. Arguments must be passed by position.

The Run method returns whatever the called macro returns. Objects passed as arguments to the macro are converted to values (by applying the Value property to the object). This means that you cannot pass objects to macros by using the Run method.

Example
This example shows how to call the function macro My_Func_Sum, which is defined on the macro sheet Mycustom.xlm (the macro sheet must be open). The function takes two numeric arguments (1 and 5, in this example).

mySum = Application.Run("MYCUSTOM.XLM!My_Func_Sum", 1, 5)
MsgBox "Macro result: " & mySum
[/more]
Если рассматривать более серьёзный подход, то ты так же можешь добавить ссылку (Tools/Reference) на свой проект (xls или xla) и вызывать процедуры и функции в проекте другой книги (для страховки вызывая через ИмяМодуля.ИмяПроцедуры Параметры)
Автор: GFSGF
Дата сообщения: 09.06.2007 08:09
AndVGri
Большое спасибо. Всё работает. А вот такой тогда ещё вопрос.
Вот эта процедура про которую я писал образуется следующим образом. Имеется прграммное обеспечение ,которое при установке на комп образует в Эксел надстройку.
Эта надстройка добавляет в сдандартное меню Экселя своё меню.
Если открыть Project Explorer в VBA то там она стоит под именем MXSheet(MXShMenu.xla). Если пытаться щёлкнуть по крестику чтобы посмотреть её ,то сразу выходит запрос на ввод пароля. Нельзя как то обойти этот пароль? Ну допустим что я его забыл а мне нужно посмотреть содержимое. Просто если бы я мог войти то мог бы использовать эти процедуры под себя. А так пока что я только знаю имена этих процедур.
Автор: AndVGri
Дата сообщения: 09.06.2007 11:38
GFSGF
Попытаться снять защиту можно VBA Password Recovery (поищи в варезнике). Другие варианты защиты VBA посмотри здесь
Автор: GFSGF
Дата сообщения: 09.06.2007 21:02
AndVGri

Цитата:
поищи в варезнике

Я извиняюсь не совсем понятно ,это где? Но за ответ всё равно спасибо.
Автор: SERGE_BLIZNUK
Дата сообщения: 10.06.2007 08:18
GFSGF
это на форуме в разделе Андерграунд - Варезник
Например, то, что Вы ищите - LostPassword (Passware) Password Recovery Kit
Автор: GFSGF
Дата сообщения: 10.06.2007 20:44
SERGE_BLIZNUK
спасибо всё понял
Автор: GFSGF
Дата сообщения: 12.06.2007 20:47
Добрый вечер.1. Приведите ,если не трудно, небольшой пример по заполнению ячеек.Cуть такая:
нужно заполнить ячейки B1:B20 данными из ячейки A1 поочерёдно,т.е.если ячейка В1 заполнена ,тогда занести данные из ячейки А1 в B2,если B2 заполнена тогда в B3 ну и так далее...

2.Как записать короче этот код[more]If UserForm3.OptionButton1.Value = True Then
Rows("5:5").EntireRow.Hidden = False
Else: Rows("5:5").EntireRow.Hidden = True

End If
If UserForm3.OptionButton2.Value = True Then
Rows("6:6").EntireRow.Hidden = False
Else: Rows("6:6").EntireRow.Hidden = True
End If
If UserForm3.OptionButton3.Value = True Then
Rows("7:7").EntireRow.Hidden = False
Else: Rows("7:7").EntireRow.Hidden = True
End If
If UserForm3.OptionButton37.Value = True Then
Rows("8:8").EntireRow.Hidden = False
Else: Rows("8:8").EntireRow.Hidden = True
End If
If UserForm3.OptionButton5.Value = True Then
Rows("9:9").EntireRow.Hidden = False
Else: Rows("9:9").EntireRow.Hidden = True
End If
If UserForm3.OptionButton6.Value = True Then
Rows("10:10").EntireRow.Hidden = False
Else: Rows("10:10").EntireRow.Hidden = True
End If
If UserForm3.OptionButton9.Value = True Then
Rows("11:11").EntireRow.Hidden = False
Else: Rows("11:11").EntireRow.Hidden = True
End If
If UserForm3.OptionButton8.Value = True Then
Rows("12:12").EntireRow.Hidden = False
Else: Rows("12:12").EntireRow.Hidden = True
End If[/more]
Заранее спасибо
Автор: AndVGri
Дата сообщения: 13.06.2007 09:53
GFSGF
1.

Код:
Dim EmptyRange As Range

Set EmptyRange = ActiveSheet.Range("B1:B20").SpecialCells(xlCellTypeBlanks)
ActiveSheet.Cells(EmptyRange.Row, 2&).Value = ActiveSheet.Range("A1").Value
Автор: GFSGF
Дата сообщения: 13.06.2007 15:56
AndVGri
Спасибо большое. Я бы до этого не додумался. Купил специально три книги по VBA,но ни в одной этого нет. Как говриться хотел как лучше , а получилось как всегда. Книги отложил и опять пошёл на форум.

Добавлено:
AndVGri

Цитата:
Dim EmptyRange As Range

Set EmptyRange = ActiveSheet.Range("B1:B20").SpecialCells(xlCellTypeBlanks)
ActiveSheet.Cells(EmptyRange.Row, 2&).Value = ActiveSheet.Range("A1").Value

Этот код сразу выдаёт ошибку "Ничего не найдено для удовлетворения этого условия"
Я так понимаю что он проверяет наличие пустых ячеек.Но ячейки все пустые,а ошибка выходит.Если заполнить ("B1:B20)данными ,а потом их все удалить то код работает нормально.Как это устранить?

Автор: rifesta
Дата сообщения: 13.06.2007 22:47
Люди, привет. Вопрос. В пользовательской форме есть два элемента RefEdit. Как проверить корректность ввода данных (диапазон) в каждом из RefEdit при нажатии кнопки на форме. Т.е. проверить, что пользователь не добавил в поле "еще что-то" или наоборот не удалил "что-то".
Автор: AndVGri
Дата сообщения: 14.06.2007 04:12
GFSGF
[more]
Это происходит, если в столбце B или полностью нет данных, или в диапазоне нет пустых ячеек. Вот для этого случая и пригодятся книги по VBA в разделе обработка ошибок. То есть

Код:
Public Sub Test()
On Error GoTo errHandle
Dim EmptyRange As Range, subValue As String

Set EmptyRange = ActiveSheet.Range("C1:C20").SpecialCells(xlCellTypeBlanks)
ActiveSheet.Cells(EmptyRange.Row, 2&).Value = ActiveSheet.Range("A1").Value
Exit Sub
errHandle:
'если код ошибки SpecailCells
If Err.Number = 1004& Then
'если диапазон пуст
subValue = Application.Evaluate("CONCATENATE(" & ActiveSheet.Range("B1:B20").Address & ")")
If subValue = vbNullString Then
ActiveSheet.Range("B1").Value = ActiveSheet.Range("A1").Value
'если диапазон заполнен
Else
MsgBox "Весь диапазон заполнен значениями", vbExclamation, "Ошибка"
End If
Else 'другой код ошибки (например не рабочий лист, а диаграмма)
MsgBox Err.Description, vbExclamation, "Ошибка"
End If
End Sub
Автор: M_a_s_i_k
Дата сообщения: 14.06.2007 09:05
Народ прошу помощи есть макрос который работает на Excel 2003 поставил Excel 2007
перестал работать выдает ошибку "Object doesn't support this action (Error 445)" вот на это "Set fs = Application.FileSearch"

Сам макрос Тут [more=>>>] Sub a2_S()
CurVal = ActiveCell.Value
Load UserForm1
UserForm1.TextBox1 = CurVal
UserForm1.Show 1
End
Set fs = Application.FileSearch

With fs
.LookIn = "\\.......\Archive2007\"

'.Filename = "*2570.*"
CurVal = ActiveCell.Value
.Filename = "*" & CurVal & ".tif*"
.SearchSubFolders = True

If .Execute > 0 Then
MsgStr = "Всего найдено " & .FoundFiles.Count & _
" файл(ов)." + Chr$(10)
For i = 1 To .FoundFiles.Count
MsgStr = MsgStr + .FoundFiles(i) + Chr$(10)
Next i
Else
MsgStr = "Не найдено ни одного файла"
End If
End With
MsgBox MsgStr

End Sub[/more]
Заранее спасибо.
Автор: divik
Дата сообщения: 15.06.2007 08:13
Ребята помогите, нужно облегчить труд при составлении калькуляций на изготовления металлоконструкций!!!
(да и вообще для состовления стоимости работ по определенным видам работ)
в шапке имеем:
№п/п,Вид работ,разряд работ,кол-во рабочих,стоимость 1 чел/час,
норма временив часах на опред.кол-во,объем работ,Трудозатраты чел-час,
Стоимость выполненных работ.
Как сделать так , чтобы вид работ заполнялся из списка,
(c другова листа,где находится весь перечень работ)(выбирая одну работу допустим ), при этом сразу заполнялись строки относящиеся к этой работе:разряд работ,кол-во рабочих,стоимость 1 чел/час,
норма временив часах на опред.кол-во,
чтобы потом ввести только объем работ и получить речультат:Трудозатраты чел-час,
Стоимость выполненных работ.
Вот пример (весит 8кб):
http://slil.ru/24516001
Автор: AndVGri
Дата сообщения: 15.06.2007 09:47
divik
Так чем помочь, что в коде не получается? Или тебе сюда
Автор: GFSGF
Дата сообщения: 16.06.2007 19:49
AndVGri
Большое спасибо.Всё работает
Автор: M1chA
Дата сообщения: 17.06.2007 23:58
Люди!помогите пожулуйста!
клиент попросил разобраться в том,как сменить время работы программы.
Что-то у меня не получилось понять эту фишку.
Выкладываю код основного модуля проги.
Язык:Excel VBA.
Если нужно,вышлю всю прогу на мыло.
[more]
Option Explicit
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
Public Const kIdx As Integer = 3, kIdx1 As Integer = 4, kIdxV As Integer = 6, kIdxMagenta As Integer = 38
Public Const defPats As Integer = 335
Const strTextMenu As String = "Па&циенты" 'пункт меню
Const strMenuTun As String = "&Настройка"
Const strMenuHlp As String = "&Состояние"
Const strMenuNal As String = "&Журнал"
Const strMenuOtch As String = "От&чёт"
Const strMenuOtchDen As String = "Отчёт за день"
Const strMenuRas As String = "&Рестарт"
Const strMenuAut As String = "&О программе"
Const strMenuNew As String = "БД &пациентов"
Public nKol As Integer, Srok As Long, SrokV As Long, SrokMagenta As Long, kPats As Long
Public MinNal As Integer, MaxNal As Integer, prNal As Integer
Public RegVer As Boolean, RegEx As Boolean 'регистрация
Public today As Boolean, Rest As Boolean
Public kProg As Integer, kSvob As Integer, kVarn As Integer, kVarnMagenta As Integer
Public pswd As Long, ScreenX As Long, ScreenY As Long

Sub Auto_Open()
Dim btn As Object, n As Integer
Const idNal As Integer = 57, DneySaveComment As Integer = 5
Const defSrok As Integer = 30
Const defSrokMagenta As Integer = 20
Const defSrokV As Integer = 10
Const defMinNal As Integer = 8
Const defMaxNal As Integer = 12
'Параметры регистрации
Const kdPr As Long = 40
Const DRJuli As Date = #10/7/1969#
'Стартовые параметры
Rest = False
n = InStr(1, ActiveWorkbook.Name, "Patsienty.xls")
prNal = GetSetting(AppName:="Pobegay", Section:="Setup", Key:="prNal", Default:=1)
kPats = GetSetting(AppName:="Pobegay", Section:="Setup", Key:="kPats", Default:=defPats)
If prNal = 0 And n > 0 Then
Worksheets("Посещения").Visible = xlSheetVisible
Else
If Worksheets("Посещения").Visible <> xlVeryHidden Then Worksheets("Посещения").Visible = xlVeryHidden
RegEx = True
Exit Sub
End If
Srok = GetSetting(AppName:="Pobegay", Section:="Setup", Key:="Srok", Default:=defSrok)
SrokMagenta = GetSetting(AppName:="Pobegay", Section:="Setup", Key:="SrokMagenta", Default:=defSrokMagenta)
SrokV = GetSetting(AppName:="Pobegay", Section:="Setup", Key:="SrokV", Default:=defSrokV)
MinNal = GetSetting(AppName:="Pobegay", Section:="Setup", Key:="MinNal", Default:=defMinNal)
MaxNal = GetSetting(AppName:="Pobegay", Section:="Setup", Key:="MaxNal", Default:=defMaxNal)
pswd = GetSetting(AppName:="Pobegay", Section:="Setup", Key:="Password", Default:=0)
RegEx = (CLng(pswd) - CLng(Date)) < 0
Select Case pswd
Case 0
pswd = CLng(Date) + kdPr
SaveSetting "Pobegay", "Setup", "Password", pswd
Case CLng(DRJuli)
RegVer = True
Case Else
If RegEx Then
MsgBox " Уважаемый Александр Афанасьевич !" & vbCrLf _
& "Напоминаю Вам, что срок пробного использования программы закончился." & vbCrLf _
& "По вопросу его продления обращайтесь к Александру Зиновьевичу" & vbCrLf _
& "по телефонам: 266-90-89 дом. и (+7) 927-2060229 сот." _
, vbCritical, "Пациенты - 2005 - TRIAL version"
' Auto_Close
Exit Sub
End If
End Select
'Настройка меню "Пациенты"
MenuBars(xlWorksheet).Menus.Add Caption:=strTextMenu, Before:=14
MenuBars(xlWorksheet).Menus(strTextMenu).MenuItems.Add _
Caption:=strMenuAut, Before:=1, OnAction:="HelpMe(3)"
MenuBars(xlWorksheet).Menus(strTextMenu).MenuItems.Add _
Caption:=strMenuRas, Before:=1, OnAction:="Restart"
MenuBars(xlWorksheet).Menus(strTextMenu).MenuItems.Add _
Caption:=strMenuOtch, Before:=1, OnAction:="OtchetPrint"
MenuBars(xlWorksheet).Menus(strTextMenu).MenuItems.Add _
Caption:=strMenuOtchDen, Before:=1, OnAction:="OtchetPrintDen"
MenuBars(xlWorksheet).Menus(strTextMenu).MenuItems.Add _
Caption:=strMenuNew, Before:=1, OnAction:="NewPats"
MenuBars(xlWorksheet).Menus(strTextMenu).MenuItems.Add _
Caption:=strMenuNal, Before:=1, OnAction:="HelpMe(2)"
MenuBars(xlWorksheet).Menus(strTextMenu).MenuItems.Add _
Caption:=strMenuTun, Before:=1, OnAction:="HelpMe(1)"
MenuBars(xlWorksheet).Menus(strTextMenu).MenuItems.Add _
Caption:=strMenuHlp, Before:=1, OnAction:="HelpMe(0)"
'Настройка панели "NalPane"
On Error Resume Next
CommandBars.Add ("NalPane")
On Error GoTo 0
With CommandBars("NalPane")
If .Controls.Count = 0 Then
Set btn = CommandBars("NalPane").Controls.Add(msoControlButton)
' btn.TooltipText = "Полундра!"
btn.FaceId = idNal
btn.OnAction = "NalEnd"
End If
.Visible = True
End With
'Запуск программы
Call Progul
' ActiveSheet.Unprotect
' Cells.Select
' Selection.Locked = True
' Columns(nKol).Select
' Selection.Locked = False
' Selection.FormulaHidden = False
' ActiveSheet.Protect Contents:=True, Scenarios:= _
' False, AllowFormattingCells:=True, AllowFormattingColumns:=True, _
' AllowFormattingRows:=True, AllowInsertingColumns:=True, AllowInsertingRows _
' :=True, AllowInsertingHyperlinks:=True, AllowDeletingColumns:=True, _
' AllowDeletingRows:=True, AllowSorting:=True, AllowFiltering:=True
n = nKol - DneySaveComment
If n > 1 Then Range(Cells(2, 2), Cells(kPats + 1, n)).ClearComments
Cells(1, nKol).Activate
ActiveWindow.ScrollColumn = nKol
ActiveCell.Interior.ColorIndex = 34
ScreenX = GetSystemMetrics(0)
ScreenY = GetSystemMetrics(1)
Load HelpForm
End Sub

Sub Auto_Close()
Dim MenuNm As Object, i As Integer, RetVal
' Выгрузка скрытых польз. форм
If UserForms.Count > 0 Then
For i = UserForms.Count - 1 To 0 Step -1
Unload UserForms(i)
Next
End If
If Worksheets("Посещения").Visible <> xlVeryHidden Then Worksheets("Посещения").Visible = xlVeryHidden
'Скрытие панели "CounterPane"
On Error Resume Next
CommandBars("NalPane").Visible = False
'Удаление меню "Пациенты"
For Each MenuNm In MenuBars(xlWorksheet).Menus
If MenuNm.Caption = strTextMenu Then MenuNm.Delete
Next
Application.StatusBar = False
If Not Rest Then
If Not ActiveWorkbook.Saved Then ActiveWorkbook.Save
If Dir("D:\Work\Temp", vbDirectory) = "Temp" Then
On Error Resume Next
RetVal = Shell("D:\Work\CopyJobPats.cmd", 1)
End If
End If
End Sub

Sub NewPats()
frmNewPats.Show
End Sub

Sub NalEnd()
SaveSetting "Pobegay", "Setup", "prNal", 1
RegEx = True
Auto_Close
End Sub

Sub Restore()
SaveSetting "Pobegay", "Setup", "prNal", 0
Restart
End Sub

Sub Restart()
Rest = True
Auto_Close
Auto_Open
End Sub

Sub HelpMe(Optional nP As Integer = 0)
HelpForm.MultiPagePob.Value = nP
HelpForm.Show
End Sub

Sub Pereschet()
Application.ScreenUpdating = False
Call Progul
HelpForm.lblRed.Caption = "Отсутствуют " & Srok & " дней - " & Str(kProg)
HelpForm.lblMagenta.Caption = "Отсутствуют " & SrokMagenta & " дней - " & Str(kVarnMagenta)
HelpForm.lblYellow.Caption = "Отсутствуют " & SrokV & " дней - " & Str(kVarn)
HelpForm.lblFree.Caption = "Свободных №№ - " & Str(kSvob)
If nKol > 0 And nKol <= 256 Then
HelpForm.lblTD = "Посещений сегодня - " & _
Str(WorksheetFunction.Sum(Range(Cells(2, nKol), Cells(kPats + 1, nKol))))
Sheets("Список").Activate
HelpForm.lblAll = "Пациентов всего - " & _
Str(WorksheetFunction.Subtotal(3, Sheets("Список").Range(Cells(2, 2), Cells(kPats + 1, 2))))
Sheets("Посещения").Activate
End If
Application.ScreenUpdating = True
End Sub

Sub Progul()
Dim nS As Integer, nK As Integer, nKs As Integer, nKsV As Integer, lenOpis As Integer, nKsMagenta As Integer
Dim today As Date, dZag As Date, kViz As Integer, kVizV As Integer, kVizMagenta As Integer
Application.ScreenUpdating = False
today = Date
nKol = nK
nKs = 0
nKsV = 0
nKsMagenta = 0
kVarn = 0
kVarnMagenta = 0
kProg = 0
kSvob = 0
Sheets("Список").Columns(2).Interior.ColorIndex = xlNone
'Sheets("Комментарии").Columns(2).Interior.ColorIndex = xlNone
Sheets("Посещения").Select
Range(Cells(1, 1), Cells(defPats + 1, 256)).Interior.ColorIndex = xlNone

For nK = 2 To 256
dZag = Cells(1, nK).Value
If nKs = 0 And dZag > today - Srok Then
nKs = nK - 1
End If
If nKsMagenta = 0 And dZag > today - SrokMagenta Then
nKsMagenta = nK - 1
End If
If nKsV = 0 And dZag > today - SrokV Then
nKsV = nK - 1
End If
If dZag >= today Then
nKol = nK
Exit For
End If
Next

' Новые рабочие листы
If nKol = 0 Then
SaveToArchive
SumViz
Worksheets("Посещения").Select
NewSheet
Worksheets("Книга").Select
NewSheet
Restart
Exit Sub
End If

For nS = 2 To kPats + 1
kViz = 0
kVizV = 0
kVizMagenta = 0
For nK = nKs To nKol
If Cells(nS, nK).Value > 0 Then kViz = kViz + 1
Next
For nK = nKsMagenta To nKol
If Cells(nS, nK).Value > 0 Then kVizMagenta = kVizMagenta + 1
Next
For nK = nKsV To nKol
If Cells(nS, nK).Value > 0 Then kVizV = kVizV + 1
Next
lenOpis = Len(Trim(Sheets("Список").Cells(nS, 2).Value))
If kViz = 0 And lenOpis > 0 Then
kProg = kProg + 1
Range(Cells(nS, nKs), Cells(nS, nKol)).Interior.ColorIndex = kIdx
Cells(nS, 1).Interior.ColorIndex = kIdx
Sheets("Список").Cells(nS, 2).Interior.ColorIndex = kIdx
' Sheets("Комментарии").Cells(nS, 2).Interior.ColorIndex = kIdx
ElseIf kVizMagenta = 0 And lenOpis > 0 Then
kVarnMagenta = kVarnMagenta + 1
Range(Cells(nS, nKsMagenta), Cells(nS, nKol)).Interior.ColorIndex = kIdxMagenta
Cells(nS, 1).Interior.ColorIndex = kIdxMagenta
Sheets("Список").Cells(nS, 2).Interior.ColorIndex = kIdxMagenta
' Sheets("Комментарии").Cells(nS, 2).Interior.ColorIndex = kIdxMagenta
ElseIf kVizV = 0 And lenOpis > 0 Then
kVarn = kVarn + 1
Range(Cells(nS, nKsV), Cells(nS, nKol)).Interior.ColorIndex = kIdxV
Cells(nS, 1).Interior.ColorIndex = kIdxV
Sheets("Список").Cells(nS, 2).Interior.ColorIndex = kIdxV
' Sheets("Комментарии").Cells(nS, 2).Interior.ColorIndex = kIdxV
ElseIf lenOpis = 0 And nS <= kPats + 1 Then
kSvob = kSvob + 1
Range(Cells(nS, 1), Cells(nS, nKol)).Interior.ColorIndex = kIdx1
' Cells(nS, 1).Interior.ColorIndex = kIdx1
Sheets("Список").Cells(nS, 2).Interior.ColorIndex = kIdx1
' Sheets("Комментарии").Cells(nS, 2).Interior.ColorIndex = kIdx1
End If
Next
Application.StatusBar = "Отсут. " & SrokV & " дн. (жёл.) - " & kVarn & _
", Отсут. " & SrokMagenta & " дн. (роз.) - " & kVarnMagenta & _
", Отсут. " & Srok & " дн. (крас.) - " & kProg & _
", Своб. - " & kSvob & _
", Сегодня - " & Str(WorksheetFunction.Subtotal(3, Range(Cells(2, nKol), Cells(kPats + 1, nKol))))
Application.ScreenUpdating = True
End Sub

Sub Nalog(nK As Integer)
Dim mas(160) As Integer
Dim i As Integer, kp As Integer, n As Integer, nal As Integer
Application.ScreenUpdating = False
Randomize
kp = Int(Rnd * (MaxNal - MinNal + 1) + MinNal)
n = 0
nal = 0
'nk = nKol 'ActiveCell.Column
For i = 2 To kPats + 1
If Cells(i, nK) = 1 Then
nal = nal + 1
mas(nal) = i - 1
End If
Next
If nal > 0 Then
If nal < kp Then kp = nal
Worksheets("Книга").Activate
ActiveWindow.ScrollColumn = nKol
Range(Cells(2, nK), Cells(kPats + 1, nK)).Select
Selection.ClearContents
Cells(1, nK).Select
ActiveCell.Interior.ColorIndex = 34
Do While n < kp
i = Int(Rnd * nal + 1)
If mas(i) > 0 Then
Cells(mas(i) + 1, nK).Value = 1
mas(i) = 0
n = n + 1
End If
Loop
Worksheets("Посещения").Activate
End If
Application.ScreenUpdating = True
End Sub

Sub NewSheet()
Dim nC As Integer, nR As Integer, D As Date
Range(Columns(2), Columns(227)).Select
Selection.Delete Shift:=xlToLeft
D = Date
nC = 31
Do
If Weekday(D, vbMonday) <> 7 Then
Cells(1, nC) = D
nC = nC + 1
End If
D = D + 1
Loop Until nC = 257
Columns(2).Select
Selection.Copy
Range(Columns(31), Columns(256)).Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Range("AB337").Select
Selection.AutoFill Destination:=Range("AB337:IV337"), Type:=xlFillDefault
End Sub

Sub OtchetPrint()
OtchForm.Show
End Sub

Sub OtchetPrintDen()
frmOtchPos.Show
End Sub

Sub testColor()
Dim i As Integer
For i = 1 To 50
Cells(340, i).Interior.ColorIndex = i
Next
End Sub

Sub testID()
Dim btn As Object, i As Integer
'Настройка панели "NalPane"
On Error Resume Next
CommandBars.Add ("NalPane")
For i = 57 To 57
On Error GoTo 0
With CommandBars("NalPane")
' If .Controls.Count = 0 Then
Set btn = CommandBars("NalPane").Controls.Add(msoControlButton)
' btn.TooltipText = "Полундра!"
btn.FaceId = i
' btn.OnAction = "NalEnd"
' End If
.Visible = True
End With
Next
End Sub

Sub SumViz()
Dim kViz As Integer, nS As Integer, nn As Integer, fd As Date, strPats As String
'kPats = 260 ' debug
Worksheets("Посещения").Select
For nS = 2 To kPats + 1
strPats = dhTrimAll(Worksheets("Список").Cells(nS, 2).Value)
If Len(strPats) > 0 Then
fd = FirstDate(strPats)
kViz = 0
For nn = 226 To 2 Step -1
If Cells(1, nn) < fd Then Exit For
If Cells(nS, nn) = 1 Then kViz = kViz + 1
Next
Worksheets("Список").Cells(nS, 2).Value = strPats & " Посещений - " & kViz & "."
End If
Next
End Sub
[/more]
Автор: AndVGri
Дата сообщения: 18.06.2007 04:38
M1chA
Закомментируй Exit Sub в процедуре Auto_Open
Автор: M1chA
Дата сообщения: 18.06.2007 12:41
AndVGri

Если закоментирую,прога не будет триальной,так?
т.е период времени через который она блокируется будет снят?
и ещё вопросю.можно сделать эту прогу как нормальную прогу,типа как когда пишут в дельфях или С...
что использовать для переноса проги в нормальный вид?
Автор: AndVGri
Дата сообщения: 18.06.2007 13:02
M1chA

Цитата:
Если закоментирую,прога не будет триальной,так?

Да, будет выдавать только сообщение - купите (хотя и не тестил, может и в другом месте, что есть - проверь)

Цитата:
можно сделать эту прогу как нормальную прогу,типа как когда пишут в дельфях или С...
что использовать для переноса проги в нормальный вид?

А какие проблемы? Пиши - исходники ж на руках
Автор: M1chA
Дата сообщения: 18.06.2007 13:12
AndVGri

Это понятно-пиши.
На что переносить,чтобы почти не изменять код
Excel VBA и Visual Basic они одинаковы?
Автор: silver007
Дата сообщения: 18.06.2007 17:14
Добрый день.
Помогите разрулить:
есть две рабочих книги- строки из одной по ключу ищутся в другой и
делается подмена данных.
Примерный макрос:
Sub Scepka()

Dim prm As String
Dim fileToOpen
Dim z_row As Integer, vStroka As Integer
Dim sourceWB As Workbook
Dim Name_WB As Workbook
...
Set sourceWB = Application.ActiveWorkbook

prm = Range("A15").Value
z_row = CStr(15)

Range("A" & z_row & ":K" & z_row).Select
Selection.Copy

Name_WB.Activate
'???????????????
vStroka = Worksheets(1).Cells.Find(What:=CStr(prm), After:=[A10], SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Row

Range("A" & vStroka & ":K" & vStroka).Select
ActiveSheet.Paste ' вставка

End Sub
Если все оставить как есть то после выполнения строки vStroka = ... макрос выходит на ошибку. Если перед ней указать prm="12345", то все работает. Эта переменная ранее была определена и она не пуста. Логики нет, либо она идет параллельным курсом? Или Activate что-то портит, если его закомментировать, опять все работает
Автор: AndVGri
Дата сообщения: 18.06.2007 17:34
M1chA
Можешь и на VB создать надстройку

silver007

Цитата:
Dim prm As String

Зачем делать
Цитата:
CStr(prm)
?
Замени

Цитата:
vStroka As Integer

на

Код:
vStroka As Long

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

Предыдущая тема: Написание своего HyperTerminal для считывания данных


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.