Оптимизация производительности двойного цикла в VBA Excel. Vba оптимизация


VBA Оптимизация макросов с помощью Solver в Excel не возвращает оптимальные переменные

Я пытаюсь оптимизировать три параметра в Excel, чтобы свести к минимуму ошибку между экспериментальным значением и теоретическим значением. Я использую Solver для каждого параметра, по одному за раз, в цикле for. Тем не менее, я хочу повторить этот решатель для цикла (цикл внутри цикла), пока ошибка в экспериментальном значении и теоретическое значение не станет меньше некоторого целевого значения.

Мое экспериментальное значение $K25. Мое теоретическое значение (рассчитанное на основе моих уравнений модели) - $J$25. Мои параметры, которые должны быть оптимизированы в $C$4, $C$5, $C$6

Когда я запускаю следующий код VBA мои параметры в $C$4, $C$5, $C$6 не изменяются от их начальных значений. Однако макрос прекрасно компилируется без ошибок. Может кто-нибудь помочь мне здесь?

Вот код:

Sub Macro3() Application.ScreenUpdating = False SolverReset Dim j As Integer For j = 1 To 100 Step 1 If "$J$25" > "$K$25" Then Dim i As Integer, s As String For i = 4 To 6 Step 1 s = Format(i, "0") SolverOk SetCell:="$J$25", MaxMinVal:=2, ValueOf:=0, ByChange:="$C$" & s, Engine:= _ 1, EngineDesc:="GRG Nonlinear" SolverOptions MaxTime:=0, Iterations:=1000000, Precision:=0.000001, Convergence _ :=0.00001, StepThru:=False, Scaling:=True, AssumeNonNeg:=True, Derivatives:=1 SolverOptions PopulationSize:=100, RandomSeed:=0, MutationRate:=0.075, Multistart _ :=False, RequireBounds:=True, MaxSubproblems:=0, MaxIntegerSols:=0, _ IntTolerance:=1, SolveWithout:=False, MaxTimeNoImp:=30 SolverOk SetCell:="$J$25", MaxMinVal:=2, ValueOf:=0, ByChange:="$C$" & s, Engine:= _ 1, EngineDesc:="GRG Nonlinear" SolverSolve (True) SolverReset Next i End If Next j Application.ScreenUpdating = True End Sub

excel vba excel-vba solver 9,512

stackoverrun.com

performance - Оптимизация производительности двойного цикла в VBA Excel

Мне интересно узнать самый быстрый способ выполнить набор инструкций в двойном цикле для циклического преобразования в двумерный диапазон ячеек. Мой код будет таким:

Sub Test() For i = 1 To 1000000 For j = 1 To 10 'It can be more than 10 'I put a set of instructions here Next j Next i End Sub

Например, предположим, что я пишу простой код для реализации следующей задачи:

Sub Test1() T0 = Timer For i = 1 To 1000000 For j = 1 To 10 Cells(i, j) = j + Rnd() Next j Next i InputBox "The runtime of this program is ", "Runtime", Timer - T0 End Sub

Я выполнил процедуру Test1 на моей машине, потребовалось 179.6406 секунд. Поскольку я не объявляю переменные (i и j), выполняется Test1 с теми переменными, которые по умолчанию не соответствуют типу Variant. Затем я добавляю одну строку в Test1, чтобы объявлять переменные как Longs, так как VBA оптимизирован для Longs. Новая процедура Test2 привела к тому, что время работы на моем компьютере сократилось до 168.7539 секунд (почти на 11 секунд быстрее).

Чтобы повысить производительность Test2, я отключил функциональность Excel, которая не нужна, когда выполняется Test2.

Sub Test3() Dim i As Long, j As Long T0 = Timer ScreenUpdateState = Application.ScreenUpdating StatusBarState = Application.DisplayStatusBar CalcState = Application.Calculation EventsState = Application.EnableEvents DisplayPageBreakState = ActiveSheet.DisplayPageBreaks Application.ScreenUpdating = False Application.DisplayStatusBar = False Application.Calculation = xlCalculationManual Application.EnableEvents = False ActiveSheet.DisplayPageBreaks = False For i = 1 To 1000000 For j = 1 To 10 Cells(i, j) = j + Rnd() Next j Next i Application.ScreenUpdating = ScreenUpdateState Application.DisplayStatusBar = StatusBarState Application.Calculation = CalcState Application.EnableEvents = EventsState ActiveSheet.DisplayPageBreaks = DisplayPageBreaksState InputBox "The runtime of this program is ", "Runtime", Timer - T0 End Sub

Этот метод помогает повысить производительность Test2 и Test3 завершается за 96.13672 секунд на моей машине. Поэтому мне интересно, есть ли более эффективный способ сделать это. Может ли кто-нибудь придумать более быструю версию? Если возможно, даже избегайте процедуры двойного цикла.

qaru.site

optimization - Оптимизация Excel VBA - Транспонирование данных

Я получил отчет в свернутом виде в Excel, который мне нужно сгладить, чтобы импортировать его в Access. Здесь образец строки:

Что должно произойти, так это то, что учетная запись и имя клиента должны быть перенесены в соседнюю с линией ваучера и должны быть скопированы, поэтому каждая строка ваучера имеет эту информацию. После преобразования данные должны выглядеть так:

Customer Account | Name | Date | Voucher | Invoice | Transation Text | Currency

Обратите внимание, что строка, начинающаяся с "USD", обозначает конец записей для этого клиента.

Я успешно выполнил следующий код:

Sub Process_Transactions() 'turn off some Excel functionality so code runs faster Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.DisplayStatusBar = False Application.EnableEvents = False Dim i As Long For i = 1 To 731055 'Move two columns in ActiveCell.Offset(0, 2).Select 'Select the customer account and name Range(ActiveCell, ActiveCell.Offset(1, 1)).Select 'Copy and paste it down two rows and over two columns Selection.Cut ActiveCell.Offset(2, -2).Select ActiveSheet.Paste 'Hop up a couple rows and delete 3 rows before the data that are not useful Rows(ActiveCell.Offset(-2).Row).Select Selection.Delete Shift:=xlUp Selection.Delete Shift:=xlUp Selection.Delete Shift:=xlUp 'Select the next row Rows(ActiveCell.Offset(1).Row).Select 'If the first record in the row is not "USD", then we have multiple rows for 'this customer While (ActiveCell.Offset(0, 2) <> "USD") 'Copy and Paste the customer account and number for each 'transaction row ActiveCell.Select Range(ActiveCell.Offset(-1, 0), ActiveCell.Offset(-1, 1)).Select Selection.Copy ActiveCell.Offset(1, 0).Select ActiveSheet.Paste ActiveCell.Select ActiveCell.Offset(1, 0).Select Wend 'Delete the two rows after the data that we need ActiveCell.Select Rows(ActiveCell.Row).Select Selection.Delete Shift:=xlUp ActiveCell.Select Rows(ActiveCell.Row).Select Selection.Delete Shift:=xlUp 'Move to the next row to start over ActiveCell.Select Debug.Print "Current Row: " & i Next i 'at the end, don't forget to restore the default behavior 'calculate the formulas Application.Calculate Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Application.DisplayStatusBar = True Application.EnableEvents = True End Sub

Проблема в том, что программа очень медленная. Я пропустил код около 10 часов прошлой ночью, и он обработал только 33k. У меня есть примерно 1,5 миллиона записей для обработки.

Я понимаю, что метод, который я использую, фактически перемещает activecell, поэтому удаление этого, скорее всего, поможет. Однако я не уверен, как действовать дальше. Если это потерянная причина и лучше подходит для реализации .net, не стесняйтесь предлагать это.

qaru.site

vba - Оптимизация цикла для vba macro excel 2007

Это должно быть довольно быстро. Надеюсь, я не слишком сильно изменил ваш код, чтобы изменить что-то, чего я не должен был.

Схват всех данных в варианте делает его намного быстрее, поскольку VBA не слишком много взаимодействует с Excel. Использование специальных ячеек также делает это. Использование "like" очищает код вверх, не знаю, лучше ли для него производительность.

Dim rng As Range Dim vData As Variant Dim i As Long Dim limitz As String Set rng = Range("G2", Range("B1").End(xlDown).Offset(0, 5).Address) 'Delete empty cells On Error Resume Next rng.SpecialCells(xlCellTypeBlanks).EntireRow.Delete On Error GoTo 0 'Get all data in range vData = rng.Resize(, 2) For i = 1 To UBound(vData) limitz = Left$(CStr(vData(i, 1)), 1) If limitz Like "[!0-9,!-]" Then vData(i, 1) = Right$(CStr(vData(i, 1)), Len(vData(i, 1)) - 1) vData(i, 2) = limitz End If Next rng.Resize(, 2) = vData

Следующий код не проверен, но должен работать и работать довольно быстро. Следует отметить, что удаленные целые строки довольно дорогостоящие (временные), чтобы сделать, хотя вы можете свести к минимуму время с помощью метода ниже, это все равно займет некоторое время, и вы не можете сделать с ним немного:

dim bUnion as boolean Dim rng As Range, rUnion as range Dim vData As Variant Dim i As Long Dim limitz As String Set rng = Range("G2", Range("B1").End(xlDown).Offset(0, 5).Address) 'Get all data in range vData = rng.Resize(, 2) bunion=false For i = 1 To UBound(vData) if len(vdata(i,1))>0 THEN limitz = Left$(CStr(vData(i, 1)), 1) If limitz Like "[!0-9,!-]" Then vData(i, 1) = Right$(CStr(vData(i, 1)), Len(vData(i, 1)) - 1) vData(i, 2) = limitz End If else if bunion then set runion=union(runion,range("A" & i+1)) else set runion=range("A" & i+1) bunion=true end if end if Next rng.Resize(, 2) = vData runion.entirerow.delete

qaru.site

Как оптимизировать функцию VBA в Excel Bilee

Должна удвоить скорость

Public Function Yield(Name As String, Price As Double) Dim Lookup As Range, rw As Integer Set Lookup = Range("LookupRange") rw = Application.WorksheetFunction.Match(Name, Lookup.Resize(ColumnSize:=1), 0) Yield = 100 * Application.Run("otherCustomFunction", Lookup.Cells(rw, 3), Lookup.Cells(rw, 7), Price) End Function

Это потому, что вы только просматриваете диапазон с именем «LookupRange» один раз, а не дважды, и вы смотрите только правильную линию один раз, а не дважды.

Вероятно, в 4 раза быстрее

Если мы получим диапазон в коде, который использует функцию yield , нам нужно сделать это только один раз

Public Function Yield(Lookup As Range, Name As String, Price As Double) rw = Application.WorksheetFunction.Match(Name, Lookup.Resize(ColumnSize:=1), 0) Yield = 100 * Application.Run("otherCustomFunction", Lookup.Cells(rw, 3), Lookup.Cells(rw, 7), Price) End Function Public Sub CallingRoutine() Dim Lookup As Range, rw As Integer Set Lookup = Range("LookupRange") ' Some code For Each someItem In someSet Dim amount As Double, Name As String, Price As Double ' Some code to deter;ine name and price amount = Yield(Lookup, Name, Price) ' Some code that used the yield Next someThing End Sub

Существует вариант этой стратегии, в котором вы объявляете Lookup вне всех подпрограмм, например, со словарем ниже.

На порядок быстрее, если вы часто Yield Доходу.

Это код:

Public Function Yield(Name As String, Price As Double) If LookDict Is Nothing Then Set LookDict = New Dictionary Dim LookVal As Variant, rw As Integer, ToUse As ToUseType LookVal = Range("LookupRange").Value For rw = LBound(LookVal, 1) To UBound(LookVal, 1) Set ToUse = New ToUseType ToUse.Row3Val = LookVal(rw, 3) ToUse.Row7Val = LookVal(rw, 7) LookDict.Add LookVal(rw, 1), ToUse Next rw End If Set ToUse = LookDict.Item(Name) Yield = 100 * Application.Run("otherCustomFunction", _ ToUse.Row3Val, ToUse.Row7Val, Price) End Function Public Sub CallingRoutine() ' Some code For Each someItem In someSet Dim amount As Double, Name As String, Price As Double ' Some code to deter;ine name and price amount = Yield(Name, Price) ' Some code that used the yield Next someThing End Sub

www.bilee.com

access-vba - оптимизация этого кода в VBA

Я немного очистил код. Вы можете поместить значения из текстовых полей в переменные, что делает код с использованием значений менее громоздкими.

'get the dates Dim before As String = A_BeforeDateTxt.Value Dim after As String = A_AfterDateTxt.Value 'check if both date fields are filled out If after.Length > 0 And before.Length > 0 Then 'check if they are valid (ie, one date is not bigger then the other) If CDate(after) > CDate(before) Then MsgBox "You have selected invalid dates. Try again." GetSQLForActiveRecords = False Exit Function Else 'this takes both fields and appends them to the sql statement strSql = strSql & " AND ([Submitted] >= #" & after & "# and [Submitted] <= #" & before & "#)" End If Else 'one or both of them are blank, select the one thats entered If (after.Length = 0 And before.Length > 0 Then strSql = strSql & " AND ([Submitted] <= #" & before & "#)" ElseIf before.Length = 0 And after.Length > 0 Then strSql = strSql & " AND ([Submitted] >= #" & after & "#)" End If End If

Вы правы, что значение, которое всегда является строкой, не может быть Nothing. Проверка состояния, которое не может произойти, только делает код более запутанным, так как это означает, что значение может быть тем, что на самом деле не может.

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

Я удалил некоторые бессмысленные комментарии. Комментарий должен объяснить, что нужно объяснять в коде, комментарий, который буквально говорит о том, что делает код, только загромождает код, например этот:

Exit Function 'exit the function'

Код можно переписать для повторного использования части, в которой вы добавляете условия, чтобы у вас ее не было в трех местах. Это сделало бы код немного более сложным, хотя и сомнительно, если он того стоит.

qaru.site

Оптимизация приложений visual basic - matematiku5.ru

Оптимизация приложений

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

Как правило, целью оптимизации является создание приложения, выполняющего все поставленные перед ним функциональные задачи максимально быстро и при этом с использованием минимального количества ресурсов системы, в частности места на диске и памяти компьютера при загрузке приложения. Перед проведением оптимизации необходимо ясно представлять, какие параметры являются более важными: скорость или ресурсы. Оптимизация приложения, таким образом, это целая стратегия создания эффективного приложения.

Рассмотрим оптимизацию приложения, включающую в себя следующие основные разделы:

Конечно, это далеко не полный список, но главные направления оптимизации он отражает.

Перед тем как строить стратегию оптимизации, рекомендуется ответить на следующие три вопроса:

Отвечая на первый вопрос, необходимо выделить цели оптимизации. Например, приложение для расчета заработной платы должно работать максимально быстро, при этом можно пожертвовать его размером. Наоборот, создавая приложение для Internet, необходимо помнить, что проект большого размера не будет работать в сети Internet, т. к. исполняемый файл приложения размером 1 Мбайт и более практически неработоспособен в сети.

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

Третий вопрос подразумевает, что оптимизацию не следует проводить до бесконечности, если существуют ограничения, не связанные с работой кода приложения. Некоторые параметры приложения могут прямо зависеть от параметров системы: скорости работы диска или сети. Поэтому следует вовремя остановиться в оптимизации параметров приложения, когда ее результат уже в малой степени зависит от приложения. Например, при работе с диском таким ограничением будет скорость выполнения операций записи/чтения данных с диска.

Оптимизация скорости работы приложения

Основной способ оптимизации скорости работы — это оптимизация кода приложения. При этом желательно прислушаться к рекомендациям разработчиков Visual Basic 6.

Таблица 10.4. Относительная скорость вычисления для типов переменных

Тип переменной

Относительная скорость

Long

Самая высокая скорость

Integer

Ниже чем у Long

Byte

Ниже чем у Integer

Single

Ниже чем у Byte

Double

Ниже чем у Single

Currency

Самая низкая скорость

1. Первый пример.

Первый вариант кода:

For nCounter = 1 То 20

Object(nCounter).Property = ObjectDef. Property

Next nCounter

Второй вариант кода:

valProperty = ObjectDef. Property For nCounter = 1 To 20

Object(nCounter).Property = valProperty

Next nCounter

2. Второй пример.

Первый вариант кода:

For nCounter = 1 То 20

Object. Property = Object. Property & sValue

Next nCounter

Второй вариант кода:

For nCounter = 1 To 20

sValueAll = sValueAll & sValue

Next nCounter

Object. Property = sValueAll

Замечание

Оптимизация кода приложения, конечно, связана и с оптимизацией его размера. Как видно из некоторых способов оптимизации кода, размер кода либо увеличивается, либо уменьшается при оптимизации скорости приложения

Оптимизация размера приложения

При оптимизации размера приложения под размером будем понимать как размер исполняемого файла, так и размер загруженного в память приложения. Особенно критичным размер является для приложений, работающих в сети Internet. Поэтому такие приложения следует делать как можно меньшего размера. Если это не получается, можно разделить большое приложение на несколько небольших, которые будут выполнять законченные функции и загружаться по мере необходимости.

Частичную оптимизацию размера кода выполняет сам Visual Basic 6. При компиляции приложения в исполняемый файл пустые строки и строки комментариев пропускаются, поэтому на них можно не экономить. В том числе можно не экономить на длине имен идентификаторов, которые также оптимизируются компилятором.

Для оптимизации размера кода подойдут такие основные рекомендации:

Оптимизация размера графики приложения

Графика занимает существенный размер приложения, поэтому важно использовать ее оптимально. Для этого подходят такие рекомендации:

Замечание

Приведенный здесь список не содержит всевозможные рекомендации и приемы оптимизации приложений. В этом вопросе помощь вам может оказать только большая практика работы с Visual Basic 6, поскольку создание оптимальных приложений сродни мастерству, оттачиваемому разработкой приложений для Visual Basic 6.

15. Основные свойства и методы объектов Screen. Примеры

Свойства объекта Screen описаны в таблице:

Свойство

Описание

ActiveControl

Возвращает ссылку на элемент управления, находящийся в фокусе

ActiveDatasheet

Возвращает ссылку на таблицу, находящуюся в фокусе.

ActiveForm

Возвращает ссылку на форму, находящуюся в фокусе.

ActiveReport

Возвращает ссылку на отчет, находящийся в фокусе.

Application

Возвращает ссылку на объект Application.

MousePointer

Устанавливает или возвращает значение, которое определяет тип курсора мыши, отображаемого в данный момент

Parent

Возвращает ссылку на объект, содержащий объект Screen.

PreviousControl

Возвращает ссылку на предыдущий находившийся в фокусе элемент управления.

При использовании объекта Screen целесообразно реализовать обработку ошибок, так как при выполнении Вашего кода в фокусе может оказаться не тот объект. Вероятно, лучше сначала применить метод SetFocus формы, отчета или элемента управления для установки фокуса? тогда Вы будете уверены, что в фокусе находится именно тот объект, который Вам нужен. Кроме того, старайтесь не использовать объект Screen с методом OutputTo объекта DoCmd.

Свойства ActiveForm и Me не обязательно возвращают ссылку на одну и ту же форму. Свойство Me представляет форму, чей код выполняется в данный момент, а свойство ActiveForm возвращает ссылку на форму, активную на экране, и это не всегда та форма, чей код сейчас выполняется. Допустим для примера, что в неактивной форме произошло событие Timer. Тогда свойство Me позволит сделать ссылку на форму, в которой произошло событие Timer, а свойство ActiveForm ? на форму, которая активна на экране в момент возникновения (и обработки) этого события.

В следующем примере событие Timer используется для обновления данных на активной форме через регулярные интервалы. Форма, в которой происходит событие Timer, может быть (а может и не быть) активной.

Private Sub Form_Load( )═════Me. Timer-Interval = 30000 End Sub

Private Sub Form_Timer( )═════Const conFormNotActive As Integer =2475═════Const conFormInDesignView As Integer = 2478

═════On Error GoTo Error_Timer═════? периодически запрашиваем источник записей "в интересах" активной формы ═════Screen. Active Form. Requery

═════Exit_Timer; Exit Sub

Error_Timer: ═════If Err = conFormNotActive Or Err = conFormInDesignView Then══════════Resume Exit_Timer ═════Else══════════MsgBox Err & ": " & Err. Description ═════End If End Sub

Объект Screen для пользователей Visual Basic 6.0

В Visual Basic 6.0 объект Screen предоставляет доступ к активной форме и элементу управления приложения, предоставляет сведения об области экрана, в которой отображается приложение, и позволяет изменять внешний вид курсора.

Свойство ActiveControl

В Visual Basic 6.0 свойство ActiveControl объекта Screen используется для определения элемента управления, на котором установлен фокус. Свойство ActiveControl может использоваться глобально, например в Screen. ActiveControl, где возвращается активный элемент управления на форме, выделенной в данный момент. Если обращение производится к определенной форме, например Form2.ActiveControl, свойство ActiveControl определяет элемент управления, который получит фокус, если указанная форма является активной.

Свойство ActiveForm

В Visual Basic 6.0 свойство ActiveForm объекта Screen используется для определения формы, имеющей в данный момент фокус. Если родительская форма MDI имеет фокус, ActiveForm возвращает дочернюю форму MDI, которая имела фокус до этого.

Свойство MousePointer

В Visual Basic 6.0 свойство MousePointer объекта Screen используется для изменения внешнего вида курсора. После задания оно применяется ко всем формам приложения.

Свойства TwipsPerPixel

В Visual Basic 6.0 свойства TwipsPerPixelX и TwipsPerPixelY объекта Screen используются для преобразования размерности экрана из логических твипов (стандартная единица измерения в Visual Basic 6.0) в точки.

Изменения кода для определения активного элемента управления

В следующем примере кода демонстрируется копирование текста из выделенного в данный момент элемента управления на выделенной форме в буфер обмена:

‘ Visual Basic 6.0

If TypeOf Screen. ActiveControl Is TextBox Then

Clipboard. SetText Screen. ActiveControl. Text

End If

Изменения кода для определения активной формы

В следующем примере кода демонстрируется изменение заголовка выделенной в данный момент формы:

‘ Visual Basic 6.0

Screen. ActiveForm. Caption = "This is the selected form"

Изменения кода для определения активной формы в приложении MDI

В следующем примере кода демонстрируется изменение заголовка выделенной в данный момент дочерней формы MDI:

‘ Visual Basic 6.0

Screen. ActiveForm. Caption = "This is the selected child form"

В Visual Basic существуют объекты, не отображаемые на форме, но использование которых несложно и может принести некоторую пользу. В прошлых главах мы говорили об объектах Printer, Err и DataObject. Давайте поговорим еще о некоторых.

Объект Screen

По-сути, объект Screen представляет собой весь экран или иначе Десктоп (DeskTop). Как и другие объекты, объект Screen имеет определенные свойства. Так, например, почему-то считается, что для определения разрешения экрана надо использовать API-функции. Но это прекрасно можно сделать и внутренними возможностями VB. У объекта Screen есть свойства .Height и .Width, которые и возвращают высоту и ширину экрана в твипах. Эти самые твипы легко преобразовать в пиксели, если использовать два других свойства объекта Screen — .TwipsPerPixelX (которое возвращает количество твипов в пикселе по-горизонтали) и .TwipsPerPixelY (которое возвращает количество твипов в пикселе по-вертикали). Таким образом, чтобы определить разрешение экрана, мы пишем приблизительно следующий код:

Private Sub Command1_Click() ‘Объявить переменные Dim VisotaScr As Long ‘для высоты Dim ShirinaScr As Long ‘для шириныVisotaScr = Screen. Height / Screen. TwipsPerPixelX ‘узнаем высоту экрана и преобразовываем ее в пикселиShirinaScr = Screen. Width / Screen. TwipsPerPixelY ‘узнаем ширину экрана и преобразовываем ее в пикселиText1 = VisotaScr & " x " & ShirinaScr ‘выводим результат в Text1 End Sub

Еще одно свойство .ActiveControl содержит ссылку на элемент управления (и его свойства), имеющий фокус. Смысл использования этого свойства следующий. Например, у тебя на формe три текстбокса. И ты хочешь активный текстбокс очистить. Вот в этом случае и можно использовать свойство. ActiveControl, например

Screen. ActiveControl. Text=""

т. е. очищается тот объект ( в нашем случае TextBox) , на котором в данный момент находится фокус. Это, конечно, несколько упрощено, по-скольку, во-первых, необходимо проверить, а текстбокс ли это? Может у тебя на форме есть другие элементы, например, PictureBox. Во-вторых, реально это свойство можно использовать только в меню, так как меню не получает фокус и активным элементом остается выбранный объект. При использовании, например, свойства. ActiveControl в процедуре CommandButton, при нажатии на кнопку Command1 фокус перейдет с нужного нам элемента на командную кнопку и мы не получим желаемого результата. Ниже, в этой главе, мы на примере работы с объектом Clipboard будем использовать это свойство применительно к меню.

Аналогично свойству .ActiveControl и свойство и .ActiveForm, но содержит ссылку на активную форму. Тогда, чтобы добраться до какого-либо элемента можно применить, например, такой оператор:Screen. ActiveForm. ActiveControl. Picture

Надо сказать, что объект Screen имеет еще свойства MouseIcon и MousePointer, которые позволяют менять вид курсора, но их использование совершенно аналогично этим свойствам для формы, которые мы анализировали в главе 5. Поэтому я не стану занимать этой дребеденью наше драгоценное время и предлагаю перейти к более нужному и интересному.

16. Основные свойства и методы объектов Clipboard. Примеры.

Сейчас мы коротенько поговорим о довольно-таки нужных текстовых свойствах, тем более, что мы будем их использовать далее при работе с объектом Clipboard. Мы уже использовали свойство SelText в прошлой главе, но на этом не остановимся. Если мы выделим кусочек текста в Text, то мы можем получить (или установить) об этом выделенном фрагменте некоторую полезную информацию как раз с помощью этих свойств:

.SelLength — возвращает или устанавливает число выделенных символов. (синтаксис объект. SelLength [= число выбранных символов]).SelStart — возвращает или устанавливает начало выделенного текста, а если текст не выбран, то указывает положение места вставки. (синтаксис объект. SelStart [= положение начала вставки]).SelText — возвращает или устанавливает строку, в которой содержится выделенный текст. Если никаких символов не выбрано, то представляет строку нулевой длины ("").(синтаксис объект. SelText [= текст выделения]).

matematiku5.ru


Prostoy-Site | Все права защищены © 2018 | Карта сайта