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

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 216 След.
Цвет ячейки по условиям двух других, условие для ячейки
 
В довесок к уже сказанному в сообщении #2.
- ячейка уже покрашена, и дело не в условном форматировании
- Вы путаете И и ИЛИ
Список не исчерпывающий, не исключено, что в файле примере обнаружится ещё какая-то причина.
Счет с двумя условиями
 
Код
=СЧЁТЕСЛИМН($A$1:$A$4;"*монитор*";$B$1:$B$4;">80";$B$1:$B$4;"<100")
Цвет ячейки по условиям двух других, условие для ячейки
 
Код
=И($S22>=$Q22;$S22>=$P22)
Убрать вывод единицы на основе пользовательской функции, Поправить код пользовательской функции
 
Код
Function ConcatUniq(xRg As Range, xChar As String) As String
    Dim xCell As Range
    Dim xDic As Object
    Set xDic = CreateObject("Scripting.Dictionary")
    For Each xCell In xRg
        If xCell.Value <> 1 Then xDic(xCell.Value) = Empty
    Next
    ConcatUniq = Join$(xDic.Keys, xChar)
    Set xDic = Nothing
End Function
Изменение работы макроса относительно значения в определённой ячейке
 
Код
'v2
Sub WayBill_print()
Dim iBt$
Dim arrHD()
Dim iMark$, iNum$, iFIO$, iCount&
On Error Resume Next
'получаем имя нажатой кнопки
iBt = Application.Caller 'это самая важная строка) если изменить имена кнопок - макрос сломается!
'проверяем - если при нажатии не возникло ошибки, то продолжаем макрос
If Err = 0 And iBt <> Empty Then
  With Worksheets("Глав")
    'исходя из полученного имени кнопки присваиваем переменным значения из соответствующих ячеек
    Select Case iBt
      'если нажата одна из кнопок напротив 1 машины
      Case "BT1-one", "BT1-many"
        'марка машины
        iMark = .Range("D2").Text
        'номер машины
        iNum = .Range("D3").Text
        'ФИО водителя
        iFIO = .Range("C4").Text
      'если нажата одна из кнопок 2 машины
      Case "BT2-one", "BT2-many"
        'тут аналогично, только данные из соответствующих ячеек
        iMark = .Range("D5").Text
        iNum = .Range("D6").Text
        iFIO = .Range("C7").Text
    End Select
    'опять же, в зависимрсти от имени кнопки, назначаем количество раз для печати
    If iBt = "BT1-one" Or iBt = "BT2-one" Then
      'один раз для печати только следующего рабочего дня
      iCount = 1
    Else
      'тут количество берется из ячеек, для многократной печати
      iCount = IIf(iBt = "BT1-many", .Range("P3"), .Range("P6"))
    End If
  End With
  With Worksheets("Лист1")
    'вставляем значения переменных в поля Путевого листа
    .Range("D5") = iMark: .Range("D6") = iNum: .Range("D7") = iFIO
    'начинаем цикл печати от 1 до нужного количества раз
    Dim I As Long
    For I = 1 To iCount
      'при этом, кажды проход цикла, вставляем в путевой лист дату следующего рабочего дня
      'используя функцию листа РАБДЕНЬ в варианте ее применения в VBA
      '.Range("D3") = Application.WorksheetFunction.WorkDay(Date, I, Worksheets("Глав").Range("V2:V29"))
      .Range("D3") = РАБДЕНЬ_ПЛЮСПРАЗД(Date, I, Worksheets("Глав").Range("V2:V29"), Worksheets("Глав").Range("W2:W29"))
      'эта строка выводит путевой лист на печать, на принтер, установленный по умолчанию
      .PrintOut 'Preview:=True 'это аргумент предпросмотра (сейчас отключен)
    Next
  End With
End If
End Sub

Function РАБДЕНЬ_ПЛЮСПРАЗД(нач_дата As Date, число_дней As Long, праздники As Range, рабочие_выходные As Range) As Date
    Dim flag As Boolean
    Dim dt As Date
    Dim ii As Long
    dt = нач_дата
    Do
        If ii >= число_дней Then Exit Do
        dt = dt + 1
        If WorksheetFunction.CountIfs(праздники, dt) > 0 Then
            flag = False
        ElseIf WorksheetFunction.CountIfs(рабочие_выходные, dt) > 0 Then
            flag = True
        ElseIf WorksheetFunction.Weekday(dt, 2) > 5 Then
            flag = False
        Else
            flag = True
        End If
        If flag Then ii = ii + 1
    Loop
    РАБДЕНЬ_ПЛЮСПРАЗД = dt
End Function
"Сортировка от А до Я" не "работает", Точнее работает только по какому-то определенному количеству первых символов в ячейке
 
МОДЕРАТОРАМ:
Предложение изменить название темы
"Сортировка строк длиной более 255 символов"
"Сортировка от А до Я" не "работает", Точнее работает только по какому-то определенному количеству первых символов в ячейке
 
Цитата
написал:
А можно сделать так, чтобы после выделения диапазона (из нескольких столбцов) макрос спрашивал по какому столбцу сортировать
Код
'v2
Sub LongStringSort()
    Dim rTarg As Range
    Set rTarg = Selection
    'Set rTarg = rTarg.Columns(1)
    Set rTarg = Intersect(rTarg, rTarg.Parent.UsedRange)
    Set rTarg = rTarg.Areas(1)
    If rTarg.Cells.CountLarge = 1 Then Exit Sub
    
    Dim rSort As Range
    On Error Resume Next
    Set rSort = Application.InputBox("Введите столбец сортировки", "Сортировка", rTarg.Columns(1).EntireColumn.Address(0, 0, xlA1), Type:=8)
    On Error GoTo 0
    If rSort Is Nothing Then Exit Sub
    If Intersect(rSort, rTarg) Is Nothing Then Exit Sub
    
    Dim xSort As Long
    xSort = rSort.Column - rTarg.Column + 1
    If xSort < 0 Then Exit Sub
    
    Dim arr As Variant
    arr = rTarg.Value
    ClearArray arr
    arr = GetSortArray(arr, xSort)
    If IsEmpty(arr) Then Exit Sub
    rTarg.Value = arr
End Sub

Private Function GetSortArray(arr As Variant, xSort As Long) As Variant
    Dim sortBeg As Long
    Dim sortFin As Long
    Dim mrr As Variant
    mrr = GetMultiColumnArray(arr, xSort, sortBeg, sortFin)
    If IsEmpty(mrr) Then Exit Function
    If sortBeg < 1 Then Exit Function
    If sortFin < sortBeg Then Exit Function
    
    With Workbooks.Add(1)
        With .Sheets(1)
            Dim rr As Range
            Set rr = .Cells(1, 1).Resize(UBound(mrr, 1), UBound(mrr, 2))
            rr.Value = mrr
            With .Sort
                .SortFields.Clear
                Dim xr As Long
                For xr = sortBeg To sortFin
                    .SortFields.Add Key:=rr.Columns(xr), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                Next
                .SetRange rr
                .Header = xlGuess
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
            End With
            mrr = rr.Value
        End With
        .Close False
    End With
    
    Dim orr As Variant
    orr = GetOneColumnArray(mrr, sortBeg, sortFin)
    
    GetSortArray = orr
End Function

Private Function GetOneColumnArray(arr As Variant, sortBeg As Long, sortFin As Long) As Variant
     Dim orr As Variant
     ReDim orr(1 To UBound(arr, 1), 1 To UBound(arr, 2) - (sortFin - sortBeg))
     
     Dim ya As Long
     Dim xa As Long
     Dim xo As Long
     Dim ss As String
     For ya = 1 To UBound(arr, 1)
        For xa = 1 To sortBeg - 1
            orr(ya, xa) = arr(ya, xa)
        Next
        xo = UBound(orr, 2)
        For xa = UBound(arr, 2) To sortFin + 1 Step -1
            orr(ya, xo) = arr(ya, xa)
            xo = xo - 1
        Next
        
        ss = ""
        For xa = sortBeg To sortFin
            ss = ss & arr(ya, xa)
        Next
        orr(ya, sortBeg) = ss
     Next
     
     GetOneColumnArray = orr
End Function

Private Function GetMultiColumnArray(arr As Variant, xSort As Long, sortBeg As Long, sortFin As Long) As Variant
    Const nStep = 255

    Dim nx As Long
    nx = GetColumnNumbers(arr, xSort, nStep)
    If nx = 0 Then Exit Function
    
    sortBeg = xSort
    sortFin = sortBeg + nx - 1
    
    Dim brr As Variant
    ReDim brr(1 To UBound(arr, 1), 1 To UBound(arr, 2) + nx - 1)
    
    Dim ss As String
    Dim iPart As Long
    Dim xb As Long
    Dim xa As Long
    Dim ya As Long
    For ya = 1 To UBound(arr, 1)
        For xb = 1 To xSort - 1
            brr(ya, xb) = arr(ya, xb)
        Next
        
        xb = UBound(brr, 2)
        For xa = UBound(arr, 2) To xSort + 1 Step -1
            brr(ya, xb) = arr(ya, xa)
            xb = xb - 1
        Next

        If arr(ya, xSort) <> "" Then
           xb = xSort
           iPart = 0
           Do
               ss = Mid(arr(ya, xSort), 1 + iPart * nStep, nStep)
               If ss = "" Then Exit Do
               brr(ya, xb) = ss
               xb = xb + 1
               iPart = iPart + 1
           Loop
        End If
    Next
    
    GetMultiColumnArray = brr
End Function

Private Function GetColumnNumbers(arr As Variant, xSort As Long, nn As Long) As Long
    Dim ni As Long
    Dim nMax As Long
    Dim ya As Long
    For ya = 1 To UBound(arr, 1)
        If arr(ya, xSort) <> "" Then
            ni = Len(arr(ya, xSort)) \ nn + 1
            If nMax < ni Then nMax = ni
        End If
    Next
    GetColumnNumbers = nMax
End Function

Private Sub ClearArray(arr As Variant)
    Dim ya As Long
    Dim xa As Long
    For ya = LBound(arr, 1) To UBound(arr, 1)
        For xa = LBound(arr, 2) To UBound(arr, 2)
            If IsError(arr(ya, xa)) Then
                arr(ya, xa) = Empty
            End If
        Next
    Next
End Sub
Планета Excel превращается в помойку
 
Цитата
написал:
Жаль что оно вообще существует и может "вылезать" в качестве истины где-нибудь в поисковиках или новостях.
Если это работает, надо создать тему "planetaexcel.ru один из лучших ресурсов по Excel". И делать это периодически )
Excel VBA. Групповое переименование файлов, на листе Excel
 
Код
Sub Rename_File()
    Dim sFilePath As String, LastRow As Long, Cell As Range
    sFilePath = Split(Range("A1").Text, " ", 3)(2)    'путь к текущей паке
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row
    If Right(sFilePath, 1) <> "\" Then sFilePath = sFilePath & "\"
    
    If Application.WorksheetFunction.CountA(Range("A3:A" & LastRow)) <> Application.WorksheetFunction.CountA(Range("B3:B" & LastRow)) Then Exit Sub
    
    For Each Cell In Range("A3:A" & LastRow)
        If Dir(sFilePath & Cell.Text, 16) <> "" And ThisWorkbook.FullName <> sFilePath & Cell.Text Then
            Name sFilePath & Cell.Text As GetNewName(sFilePath, Cell.Offset(0, 1).Text) 'переименовываем файл
        End If
    Next Cell
    'Update file list
    Call ListFilesInFolder(sFilePath)
    Shell "explorer.exe " & sFilePath, vbNormalFocus
End Sub

Private Function GetNewName(sFilePath As String, sName As String) As String
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Dim sBase As String
    sBase = fso.GetBaseName(sName)
    Dim sExte As String
    sExte = "." & fso.GetExtensionName(sName)
    Dim sFull As String
    Dim sIndx As String
    Dim ii As Long
    
    Do
        If ii = 0 Then
            sIndx = ""
        Else
            sIndx = "(" & ii & ")"
        End If
        sFull = sFilePath & sBase & sIndx & sExte
        If Dir(sFull, 16) = "" Then Exit Do
                
        ii = ii + 1
    Loop
    GetNewName = sFull
End Function
"Сортировка от А до Я" не "работает", Точнее работает только по какому-то определенному количеству первых символов в ячейке
 
Выделите диапазон, запустите макрос.
Код
Sub LongStringSort()
    Dim rTarg As Range
    Set rTarg = Selection
    Set rTarg = rTarg.Columns(1)
    Set rTarg = Intersect(rTarg, rTarg.Parent.UsedRange)
    Set rTarg = rTarg.Areas(1)
    If rTarg.Cells.CountLarge = 1 Then Exit Sub
    
    Dim arr As Variant
    arr = rTarg.Value
    ClearArray arr
    arr = GetSortArray(arr)
    If IsEmpty(arr) Then Exit Sub
    rTarg.Value = arr
End Sub

Private Function GetSortArray(arr As Variant) As Variant
    Dim mrr As Variant
    mrr = GetMultiColumnArray(arr)
    If IsEmpty(mrr) Then Exit Function
    
    With Workbooks.Add(1)
        With .Sheets(1)
            Dim rr As Range
            Set rr = .Cells(1, 1).Resize(UBound(mrr, 1), UBound(mrr, 2))
            rr.Value = mrr
            With .Sort
                .SortFields.Clear
                Dim xr As Long
                For xr = 1 To rr.Columns.Count
                    .SortFields.Add Key:=rr.Columns(xr), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                Next
                .SetRange rr
                .Header = xlGuess
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
            End With
            mrr = rr.Value
        End With
        .Close False
    End With
    
    Dim orr As Variant
    orr = GetOneColumnArray(mrr)
    
    GetSortArray = orr
End Function

Private Function GetOneColumnArray(arr As Variant) As Variant
     Dim orr As Variant
     ReDim orr(1 To UBound(arr, 1), 1 To 1)
     
     Dim ya As Long
     Dim xa As Long
     Dim ss As String
     For ya = 1 To UBound(arr, 1)
        ss = ""
        For xa = 1 To UBound(arr, 2)
            ss = ss & arr(ya, xa)
        Next
        orr(ya, 1) = ss
     Next
     
     GetOneColumnArray = orr
End Function

Private Function GetMultiColumnArray(arr As Variant) As Variant
    Const nStep = 255

    Dim nx As Long
    nx = GetColumnNumbers(arr, nStep)
    If nx = 0 Then Exit Function
    
    Dim brr As Variant
    ReDim brr(1 To UBound(arr, 1), 1 To nx)
    
    Dim ss As String
    Dim xb As Long
    Dim ya As Long
    For ya = 1 To UBound(arr, 1)
         If arr(ya, 1) <> "" Then
            xb = 1
            Do
                ss = Mid(arr(ya, 1), 1 + (xb - 1) * nStep, nStep)
                If ss = "" Then Exit Do
                brr(ya, xb) = ss
                xb = xb + 1
            Loop
         End If
    Next
    
    GetMultiColumnArray = brr
End Function

Private Function GetColumnNumbers(arr As Variant, nn As Long) As Long
    Dim ni As Long
    Dim nMax As Long
    Dim ya As Long
    For ya = 1 To UBound(arr, 1)
        If arr(ya, 1) <> "" Then
            ni = Len(arr(ya, 1)) \ nn + 1
            If nMax < ni Then nMax = ni
        End If
    Next
    GetColumnNumbers = nMax
End Function

Private Sub ClearArray(arr As Variant)
    Dim ya As Long
    Dim xa As Long
    For ya = LBound(arr, 1) To UBound(arr, 1)
        For xa = LBound(arr, 2) To UBound(arr, 2)
            If IsError(arr(ya, xa)) Then
                arr(ya, xa) = Empty
            End If
        Next
    Next
End Sub
"Сортировка от А до Я" не "работает", Точнее работает только по какому-то определенному количеству первых символов в ячейке
 
Разбейте с помощью ПСТР() на 4 столбца, и сортируйте.
"Сортировка от А до Я" не "работает", Точнее работает только по какому-то определенному количеству первых символов в ячейке
 
Сортировка тестов длиной более 255 символов (planetaexcel.ru)
Это?
Отбор по диапазону дат и количественных параметров, Перебор параметров по дате и количеству с помощью формул Excel
 
Цитата
написал:
она нужна?
Я не настаиваю. В сообщении #2 написано, за что она отвечает.
Отбор по диапазону дат и количественных параметров, Перебор параметров по дате и количеству с помощью формул Excel
 
Можете формулу менять, а можно в диапазон на листе "партии кол-во и срок" строки добавить.
Выделите, например строки с 28-ой по 100. Вставьте строки. Формулы сами изменятся под новый диапазон.
Отбор по диапазону дат и количественных параметров, Перебор параметров по дате и количеству с помощью формул Excel
 
 - срок годности каждой партии должен быть не меньше чем 30 дней от текущий даты, если хотя бы одна партия в поставке не проходит по сроку, то не берется вся поствка
Код
=ЕСЛИ((100000-МАКС(('партии кол-во и срок'!$C$2:$C$29=A2)*(100000-'партии кол-во и срок'!$J$2:$J$29)))>($F$1+30);"да";"нет")
Вводить как формулу массива, Ctrl+Shift+Enter.
Отбор по диапазону дат и количественных параметров, Перебор параметров по дате и количеству с помощью формул Excel
 
 - количество в партии не меньше 40 ,если в какой-то одной партии количество меньше 40, то не берется вся поставка
Код
=ЕСЛИ((1000-МАКС(('партии кол-во и срок'!$C$2:$C$29=A2)*(1000-'партии кол-во и срок'!$G$2:$G$29)))>40;"да";"нет")
Вводить как формулу массива, Ctrl+Shift+Enter.
Отбор по диапазону дат и количественных параметров, Перебор параметров по дате и количеству с помощью формул Excel
 
 - номера поставок всегда 8 цифр, в кажой поставке всегда 4 партии
Код
=ЕСЛИ((ДЛСТР(A2)=8)*(СЧЁТЕСЛИМН('партии кол-во и срок'!C:C;A2)=4);"да";"нет")
Ввод числа с прибавлением
 
Код
Private Const myColumn = "E"

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Cells.CountLarge > 1 Then Exit Sub
    If Target.Column <> Range(myColumn & 1).Column Then Exit Sub
            
    On Error Resume Next
    Dim dValue As Double
    dValue = Target.Value
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Undo
    Target.Value = Target.Value + dValue
    Application.EnableEvents = True
    Application.ScreenUpdating = True
    On Error GoTo 0
End Sub
Поиск нескольких категорий в одном столбце с использованием функций EXCEL, Поиск в столбце нескольких значений
 
Код
=(ЛЕВСИМВ(A2;4)="I60.")+(ЛЕВСИМВ(A2;4)="I61.")+(ЛЕВСИМВ(A2;4)="I62.")+(ЛЕВСИМВ(A2;4)="I63.")+(ЛЕВСИМВ(A2;4)="I64.")
[ Закрыто] ChatGPT сделал мне макрос. Делюсь, может кому то пригодится ), Повторяет значения с заданным мне шагом.
 
Цитата
написал:
Интересно, это сложный макрос ?  
Использование коллекции в качестве элемента словаря - это точно не джун, пусть будет мидл.
Взаимодействие между двумя таблицами по средствам ВПР
 
Код
=ИНДЕКС('для форума_1.xlsx'!Таблица1[[#Все];[Адрес объекта]];ПОИСКПОЗ($O$55;'[для форума_1.xlsx]АИС РСМ'!$L:$L;0))
Файл сохраните в формате xlsx, закройте-откройте.
Поиск значения в одном столбце по данным с другого столбца с копированием адреса ячейки
 
Код
Sub test()
    Dim c1 As Range
    Dim c2 As Range
    Dim found As Boolean
    For Each c1 In Range("F4:F8")
        found = False
        For Each c2 In Range("C4:C21")
            'Если данные в столбце 2 найдены то
            If c2.Value = c1.Value Then
                'Если найденная ячейка в столбце 2 была уже закрашена желтым, то в столбце   3   написать " ОК – желтая"
                If c1.Cells(1, 2).Interior.Color = RGB(255, 255, 0) Then
                    c1.Cells(1, 2).Value = "ОК – желтая"
                Else
                    'В столбец 3, рядом с текущей ячейкой,  записать "ОК".
                    c1.Cells(1, 2).Value = "ОК"
                End If
                'закрасить найденную ячейку в столбце 2 с совпадающим значением из столбца 1 желтым цветом.
                c1.Cells(1, 2).Interior.Color = c2.Interior.Color
                'В столбец 4 записать адрес ячейки из столбца 2.
                c1.Cells(1, 3).Value = c2.Address(0, 0)
                found = True
                Exit For
            End If
        Next
        'Если ячейка с совпадающим значением в столбце 2 не была найдена
        If Not found Then
            'то в столбце   3   написать  не найдена и закрашивает ячейку  красным цветом
            c1.Cells(1, 2).Value = "не найдена"
            c1.Cells(1, 2).Interior.Color = RGB(255, 0, 0)
        End If
    Next
End Sub
Код с учётом
Цитата
написал:
Тока начинаю изучать VBA
Макрос на заполнения ячеек после определенного символа в предыдущей ячейке.
 
Код
Const myRange = "E5:M24"

Sub poisk()
Dim YourRange As Range, iFoundRng As Range, k As Long
Dim firstAddress As String, findDan As String, arrZam

Set YourRange = Range(myRange)
'Set YourRange = Application.InputBox _
'        (Prompt:="Выделите диапазон ячеек", _
'        Title:="", Type:=8)
'If YourRange Is Nothing Then MsgBox "Выберите диапазон, а то ни чего делать не буду", vbInformation, "НУ?!"

findDan = "д"
arrZam = Split("1~2~3~4~5", "~")
k = UBound(arrZam) + 1
If Not YourRange Is Nothing Then
            Set iFoundRng = YourRange.Find(What:=findDan, LookIn:=xlFormulas, LookAt:=xlWhole) 'поиск
            If Not iFoundRng Is Nothing Then 'если нашли
                firstAddress = iFoundRng.Address 'запоминаем адрес найденной ячейки, чтобы продолжить поиск по листу
                iFoundRng.Offset(, 1).Resize(, k).Value = arrZam
                
                
                'Debug.Print firstAddress
                Do 'цикл поиска, т.к. одно и то же значение может встречаться много раз
                    Set iFoundRng = YourRange.FindNext(iFoundRng) 'продолжаем поиск на том же листе
iFoundRng.Offset(, 1).Resize(, k).Value = arrZam
                    'Debug.Print iFoundRng.Address
                Loop While iFoundRng.Address <> firstAddress
            End If


End If
End Sub
Перенос данных из одного столбца в строки при изменении данных, Разбивка данных из одного столбца на строки с учетом изменения данных в столбце
 
Вариант формулой.
Код
=СУММЕСЛИМН(исх!$C:$C;исх!$A:$A;ДАТА(ГОД(СЕГОДНЯ());МЕСЯЦ(СЕГОДНЯ())-1;СТРОКА(1:1));исх!$B:$B;ВРЕМЯ(СТОЛБЕЦ();0;0))
Копирование в ячейку, установленную функцией АДРЕС, Разработка макроса
 
Цитата
написал:
разработать VBA-макрос
Если это требование некритично, то вариант формулой. Вставить в B6 и протянуть.
Код
=ЕСЛИ(ПОДСТАВИТЬ(ЯЧЕЙКА("адрес";B6);"$";"")=$D$2;$E$2;"")
Сумма значений (одна дата)=1, Нужно сложить нарастающий итог, так чтобы все что было в одну дату =1
 
В ячейку C3 и протянуть вниз.
Код
=ЕСЛИОШИБКА(ВПР(A1;A2:C$1048576;3;0);0)--(СЧЁТЕСЛИМН(A1:A$1048576;A1;B1:B$1048576;B1)=1)
Создание случайного пароль на листы Excel, Генерация случайного пароля на лист в эксель с помощью макроса
 
Код
Private Sub Workbook_Open()
    LockSheet Sheets("Реестр")
End Sub
Код
Option Explicit

Private Const MAX_PASSWORD_LENGTH = 3
Private Const letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"

Sub LockActiveSheetSheet()
    LockSheet ActiveSheet
End Sub

Public Sub LockSheet(sh As Worksheet)
    Dim rPassword As Range
    Set rPassword = Sheets("АПП").Range("U82")

    Dim sPassword As String
    sPassword = rPassword.Value
    On Error Resume Next
    sh.Unprotect Password:=sPassword
    On Error GoTo 0
    
    sPassword = GetPassword(MAX_PASSWORD_LENGTH * Rnd() + 1)
    
    'sPassword = InputBox("Заблокировать лист паролем?", "", sPassword)
    If sPassword <> "" Then
        'Debug.Print Now, sPassword
        On Error Resume Next
        sh.Protect Password:=sPassword
        If Err = 0 Then rPassword.Value = sPassword
        On Error GoTo 0
    End If
End Sub

Private Function GetPassword(lLen As Byte) As String
    
    Dim arr As Variant
    ReDim arr(1 To lLen)
    
    Dim crr As Variant
    crr = GetCharArray()
    
    Randomize
    Dim ya As Long
    Dim yc As Long
    For ya = 1 To UBound(arr)
        yc = (UBound(crr) - 1) * Rnd() + 1
        arr(ya) = crr(yc)
    Next
        
    GetPassword = Join(arr, "")
End Function

Private Function GetCharArray() As Variant
    Dim arr As Variant
    ReDim arr(1 To Len(letters))
    
    Dim ya As Long
    For ya = 1 To UBound(arr)
        arr(ya) = Mid(letters, ya, 1)
    Next
    GetCharArray = arr
End Function

Цитата
написал:
просто нужен код ...
Куда уж проще?
Ввод числа с прибавлением
 
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Cells.CountLarge > 1 Then Exit Sub
    If Target.Column <> 1 Then Exit Sub
            
    On Error Resume Next
    Dim dValue As Double
    dValue = Target.Value
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Undo
    Target.Value = Target.Value + dValue
    Application.EnableEvents = True
    Application.ScreenUpdating = True
    On Error GoTo 0
End Sub
Создание случайного пароль на листы Excel, Генерация случайного пароля на лист в эксель с помощью макроса
 
Код
Option Explicit

Private Const MAX_PASSWORD_LENGTH = 3

Sub LockActiveSheetSheet()
    LockSheet ActiveSheet
End Sub

Private Sub LockSheet(sh As Worksheet)
    Dim sPassword As String
    sPassword = GetPassword(MAX_PASSWORD_LENGTH * Rnd() + 1)
    
    sPassword = InputBox("Заблокировать лист паролем?", "", sPassword)
    If sPassword <> "" Then
        Debug.Print Now, sPassword
        On Error Resume Next
        sh.Protect Password:=sPassword
        On Error GoTo 0
    End If
End Sub

Private Function GetPassword(lLen As Byte) As String
    Const letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
    
    Dim brr As Variant
    ReDim brr(1 To Len(letters))
    
    Dim yb As Long
    For yb = 1 To UBound(brr)
        brr(yb) = Mid(letters, yb, 1)
    Next
    
    Dim arr As Variant
    ReDim arr(1 To lLen)
    
    Randomize
    Dim ya As Long
    For ya = 1 To UBound(arr)
        yb = UBound(brr) * Rnd() + 1
        arr(ya) = brr(yb)
    Next
        
    GetPassword = Join(arr, "")
End Function
Ввод числа с прибавлением
 
В модуль листа.
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Cells.CountLarge > 1 Then Exit Sub
            
    On Error Resume Next
    Dim dValue As Double
    dValue = Target.Value
    Application.EnableEvents = False
    Application.Undo
    Target.Value = Target.Value + dValue
    Application.EnableEvents = True
    On Error GoTo 0
End Sub
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 216 След.
Наверх