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

Страницы: 1 2 След.
Блокировка кнопки "сохранить и отправить"
 
Посмотрел, поразбирался.
пришел к выводу что заблокировать кнопки меню файл - нельзя.
Остается вариант научиться отслеживать события появления диалоговых окон, в том числе и искомый ниже.
На сколько я понимю сделать это можно лишь используя модули классов, но в этом к сожалению не силен. Буду благодарен за помощь.
Код
Application.Dialogs(xlDialogSendMail).Show
Блокировка кнопки "сохранить и отправить"
 
Нашел эту кнопку и попытался ей назначить макрос. В итоге сломал эксель... теперь просто не запускается. Что же я сделал не так?
Код
Private Sub Workbook_Open()
Application.CommandBars(35).Controls(1).Controls(28).OnAction = "zapret"
End Sub
Код
Public Sub zapret()
MsgBox "вам запрещено отправлять книгу по почте!", vbCritical
End Sub
Блокировка кнопки "сохранить и отправить"
 
Цитата
Юрий М написал:
А я сначала кнопку такую искал.
Спасибо, поправил описание.
Пока что идей нет?
Блокировка кнопки "сохранить и отправить"
 
Извините, не уточнил сразу. Дело здесь не в файле. MS Excel 2010  - это вся необходимая информация.
А меню файл - сохранить и отправить доступно из любой книги.
Блокировка кнопки "сохранить и отправить"
 
Добрый день!
Проблема в следующем:
Есть файл в который зашито множество проверок срабатывающих при событии сохранения книги (сделано на тот случай чтобы пользователь не мог некорректно заполнить файл).
Но некоторые пользователи додумались что если пользоваться  кнопокой в меню Файл -> сохранить и отправить - > отправить как вложение, то в этом случае проверки не срабатывают и можно отправлять косячный файл.
Вопрос, как программно заблокировать/отключить данную опцию в книге, либо отлавливать событие появления этого диалогового окна.
Заранее спасибо.
Изменено: Sergey_batishev - 07.04.2017 15:21:01
Как отключить появление msgbox прописанных в коде
 
Гениально!!!
Спасибо!
Как отключить появление msgbox прописанных в коде
 
К сожалению изменять книга2 я не могу
Как отключить появление msgbox прописанных в коде
 
Уважаемы знатоки, добрый день!
Имеется проблема до абсурдности не логичная, но требующая решения.

Задача следующая:
Необходимо написать макрос1 в книге1, который бы  по очереди открывал все книги2 в папке и выполнял в них макрос2, содержащийся в каждой книге2.
Проблема состоит в том, что код в макрос2 заканчивается на вывод msgbox считающий время выполнения макроса:
Код
MsgBox "данные обработаны за  " & Timer - t & " сек.", vbInformation
и каждый раз нужно жать "ok". Что крайне нежелательно, т.к. книг2 в папке может быть более 100.
Так вот вопрос в том как отключить/избежать появления msgbox в макрос2?
Заранее благодарен.
PS: для наглядности сбрасываю пример макроса1 в книге1
Код
Sub opening()
    Dim sFolder As String, sFiles As String
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = False Then Exit Sub
        sFolder = .SelectedItems(1)
    End With
    sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator)    
    sFiles = Dir(sFolder & "*.xls*")
    Do While sFiles <> ""
        'Открытие книги
        Workbooks.Open sFolder & sFiles
        'действие с файлом
            Application.Run "'" & sFiles & "'!All.all_in_one"        
        ActiveWorkbook.Close True
        sFiles = Dir
    Loop
End Sub
и макрос2 в книге2
Код
Public CheckForPlan As Boolean
Sub all_in_one()
t = Timer
Call оргструктура
Call продажи
Call инвестиции
MsgBox "данные обработаны за " & Round(Timer - t, 2) & " сек.", vbInformation
End Sub
Заранее огромное спасибо!
Сохранение структуры файла без сохранения изменения данных
 
Цитата
ikki написал:
или даже еще лучше так: пользователь нажал "сохранить", рабочий лист скрывается, отображается лист с инструкцией. файл в таком виде сохраняется и тут же, макросом, снова отображается рабочий лист.
Гениально!
У меня тоже возникла идея, чтобы если пользователь нажимал "нет", книга переоткрывалась.
А на событие workbooks open поставить проверку на активный лист, если он не    лист с инструкцией, скрыть все листы, отобразить лист с инструкцией и закрыть книгу.
Но че-то он не срабатывает....
Сохранение структуры файла без сохранения изменения данных
 
Что-то мне подсказывает что игра не стоит свечь...
Наткнулся на статью:
http://www.excel-vba.ru/chto-umeet-excel/chto-neobxodimo-dlya-vneseniya-izmenenij-v-proekt-vbamakros...

Вот цитата:

Но куда важнее то, без чего работа с проектом VBA программно невозможна. Я знаю два основных условия:
  1. Необходимо проставить доверие к проекту VBA:
    • Excel 2010 – Файл-Параметры-Центр управления безопасностью-Параметры макросов-поставить галочку «Доверять доступ к объектной модели проектов VBA»;
    • Excel 2007 – Меню-Параметры Excel-Центр управления безопасностью-Параметры макросов-поставить галочку «Доверять доступ к объектной модели проектов VBA»;
    • Excel 2003 – Сервис – Параметры-вкладка Безопасность-Параметры макросов-Доверять доступ к Visual Basic ProjectПричем сделать это необходимо на том ПК, на котором будет выполняться код.
  • Изменяемый VBA-проект не должен быть защищен.
  • Сохранение структуры файла без сохранения изменения данных
     
    Хм, интересно.. Сейчас попробую сделать.
    Сохранение структуры файла без сохранения изменения данных
     
    Цитата
    Влад написал:
    Разве что все что доступные Undo предварительно программно выполнить
    К сожалению не выйдет, в книге изменения обрабатываются событием worksheet_change. А действия макроса отменить нельзя....
    Цитата
    Xapa6apga написал:
    Я бы попробовал как-то восстановить пред версию книги(Они полюбому где-то должны хранится) и в ней уже сделать манипуляцию:
    Совершенно согласен, но как можно вытащить прежние версии?
    Цитата
    Xapa6apga написал:
    У меня даже блок WorkBook_Open не сработал, так мне кажется будет правильно:
    Спасибо! урезал код в попыхах..
    Сохранение структуры файла без сохранения изменения данных
     
    Всем привет!
    Имеется файл с макросами на события (открытия книги, закрытия сохранения и проч). Файл отправляется для обработки многим пользователям.
    Есть большая вероятность того что у кого-то выключены макросы в безопасности.
    Хочется сделать проверку на "включенность" макросов.
    Я сделал доп. лист (вложение) в котором написал что для работы с файлом необходимо включить макросы и инструкцию как это сделать.
    При открытии книги, если макросы включены -  этот лист скрывается, структура книги блокируется паролем и отображается нужный для работы лист.
    При закрытии книги, если пользователь говорит "Да" - все листы скрываются и остается видимым только лист с инструкцией.

    А вот теперь вопрос: если пользователь нажмет "Нет", как при этом оставить видимым только лист с инструкцией, и НЕ сохранять изменения, которые пользователь внес после последнего сохранения.

    Заранее огромное спасибо!
    Копирование всех ячеек в зафильтрованном диапазоне
     
    Всем спасибо за помощь, по времени примерно в 10 раз быстрее оказалось запоминать критерии фильтра, копировать и вставлять значение и формат через специальную вставку, а затем заново восстанавливать фильтр. Конечно выглядит как черти-что, а сбоку бантик... Но все же рабочий вариант приемлемый по времени.
    Если у кого еще есть идеи как делать перенос атрибутов из зафильтрованного диапазона - поделитесь пожалуйста.
    Копирование всех ячеек в зафильтрованном диапазоне
     
    Влад, спасибо. Классная штука!
    Но копирует все равно достаточно долго...
    В оригинальной книге у меня диапазон Usedrange имеет 7000 строк и 120 столбцов.
    Копирование идет более 15 секунд. Это достаточно долго, учитывая что делать эту процедуру приходится очень часто..
    Если другой альтернативы нет, возможно имеет смысл запоминать критерии фильтра, снимать его перед копированием, а потом ставить снова?
    P.S. Из форматирования необходима только заливка ячейки.
    Изменено: Sergey_batishev - 03.08.2015 17:11:23
    Копирование всех ячеек в зафильтрованном диапазоне
     
    Написал такой код для переноса данных с последнего листа на первый.
    Вопрос в том, можно ли переносить формат не поячеечно, а как-то более рационально...
    Код
    Sub Макрос1()
    Dim shA As Worksheet, shB As Worksheet
    Dim masA As Range, masB As Range
    Dim r As Long, k As Long, rSh1 As Long, kSh1 As Long
    
    Set shB = ActiveWorkbook.Sheets(1)
    Set shA = ActiveWorkbook.Sheets(Sheets.Count)
    
    Set masB = shB.UsedRange
    Set masA = shA.UsedRange
    
    r = masA.Rows.Count
    k = masA.Columns.Count
    rSh1 = masB.Rows.Count
    kSh1 = masB.Columns.Count
    
    'перенос данных на лист shB
    Application.ScreenUpdating = False
        shB.Rows("1:" & rSh1).Delete
        Range(shB.Cells(1, 1), shB.Cells(r, k)).Value = masA.Value
        Set masB = shB.UsedRange
            For i = 1 To masA.Cells.Count
                masB.Cells(i).Interior.Color = masA.Cells(i).Interior.Color
            Next i
    Application.ScreenUpdating = True
    End Sub
    
    Копирование всех ячеек в зафильтрованном диапазоне
     
    Цитата
    Казанский написал:
    Поячеечно - это слишком Код?12345Sub Макрос1()With ActiveSheet.UsedRange  .Offset(.Rows.Count + 5).Value = .ValueEnd WithEnd Sub
    Спасибо, но нужен вариант с переносом фарматирования
    Копирование всех ячеек в зафильтрованном диапазоне
     
    Добрый день!
    Есть зафильтрованный диапазон (вложение)
    Подскажите, каким образом можно скопировать все ячейки из usedrange?
    Обычное копирование копирует только видимые..
    Удаление срок на защищенном листе
     
    Всем спасибо, реализовал так как говорил Слэн и Prist.
    Если кому интересно, вот код для вставки в любой модуль книги. У меня был пароль 1213.
    PS. Код по сбросу контекстного меню одолжил у The_Prist из соседней темы.
    Код
    Sub ToggleCaseMacro()
    Set shA = ActiveWorkbook.Sheets(1)
    shA.Unprotect 1213
        Selection.EntireRow.Delete
    If shA.ProtectContents = False Then
    shA.Protect Password:=1213, UserInterfaceOnly:=True, DrawingObjects:=False, AllowFormattingColumns:=True, _
            AllowInsertingRows:=True, AllowDeletingColumns:=False, AllowSorting:=False, AllowFiltering:=True
    End If
    End Sub
    Sub ToggleCaseMacro1()
    Set shA = ActiveWorkbook.Sheets(1)
    shA.Unprotect 1213
        Selection.EntireRow.Delete
    If shA.ProtectContents = False Then
    shA.Protect Password:=1213, UserInterfaceOnly:=True, DrawingObjects:=False, AllowFormattingColumns:=True, _
            AllowInsertingRows:=True, AllowDeletingColumns:=False, AllowSorting:=False, AllowFiltering:=True
    End If
    End Sub
    Sub DeleteFromCellMenu()
        Dim ContextMenu As CommandBar
        Dim ContextMenu1 As CommandBar
        Dim ContextMenu2 As CommandBar
        Dim ctrl As CommandBarControl
        Dim ctrl1 As CommandBarControl
    
        ' Устанавливаем контекстное меню для ячейки строки и столбца
        Set ContextMenu = Application.CommandBars("Cell")
        Set ContextMenu1 = Application.CommandBars("row")
        Set ContextMenu2 = Application.CommandBars("column")
         
    ' Удаляем тег "удалить строку(и)" если он уже существует
        For Each ctrl In ContextMenu.Controls
            If ctrl.Tag = "Удалить сроку(и)" Then
                ctrl.Delete
            End If
        Next ctrl
    ' Удаляем тег "удалить строку" если он уже существует
        For Each ctrl1 In ContextMenu1.Controls
            If ctrl1.Tag = "Удалить сроку" Then
                ctrl1.Delete
            End If
        Next ctrl1
         
    'Удаляем стандартные кнопки удалить в контекстном меню
         On Error Resume Next
        ContextMenu.FindControl(ID:=292).Delete
        ContextMenu1.FindControl(ID:=293).Delete
        ContextMenu2.FindControl(ID:=294).Delete
        On Error GoTo 0
    End Sub
    Sub Reset_All_Bars()
    Dim cmbComBar As CommandBar
    On Error Resume Next
    For Each cmbComBar In CommandBars
    cmbComBar.Reset: cmbComBar.Enabled = True
    Next cmbComBar
    End Sub

    А это код для вставки в объект "ЭтаКнига". Макрос преобразовывает контекстное меню только для текущей книги, основываясь на событиях активации и деактивации книги.
    Код
    Public Sub Workbook_Activate()
        Dim ContextMenu As CommandBar
        Dim ContextMenu1 As CommandBar
        ' Delete the controls first to avoid duplicates.
        Call DeleteFromCellMenu
        ' Set ContextMenu to the Cell context menu.
        Set ContextMenu = Application.CommandBars("Cell")
        ' Add one custom button to the Cell context menu.
        With ContextMenu.Controls.Add(Type:=msoControlButton, before:=7)
            .OnAction = "ToggleCaseMacro"
            .Caption = "Удалить сроку(и)"
            .Tag = "Удалить сроку(и)"
        End With
        
        Set ContextMenu1 = Application.CommandBars("row")
        With ContextMenu1.Controls.Add(Type:=msoControlButton, before:=7)
            .OnAction = "ToggleCaseMacro1"
            .Caption = "Удалить сроку"
            .Tag = "Удалить сроку"
        End With
    End Sub
    Public Sub Workbook_Deactivate()
    Call Reset_All_Bars
    End Sub
    
    Удаление срок на защищенном листе
     
    Ага.. это не проблема.
    Просто хорошо было бы автоматизировать это так, чтобы пользователь работал как обычно, а макрос отлавливал событие удаления строки.
    и на этот момент отключал защиту, а потом включал опять.
    Что-то вроде:
    Код
    Sub Worksheet_Change(ByVal Target As Range)
    

    Только вот как поймать это событие удаления?
    Удаление срок на защищенном листе
     
    Удалить строку не получится, если в ней есть хотя бы одна заблокированная ячейка.
    Даже если поставить галочку "удаление строк"
    Изменено: Sergey_batishev - 24.06.2015 10:22:05
    Удаление срок на защищенном листе
     
    Подскажите пожалуйста!
    Имеется лист, в котором защищены от изменения несколько столбцов, содержащих формулы.
    Пользователь может пользоваться фильтром и удалять не нужные ему строки.
    Вернее он Хочет это делать, но у него не выйдет, т.к. стоит защита на ячейках с формулами.

    Как пользователю разрешить удалять строки?
    Хочется сделать так чтобы пользователь не пользовался никакими кнопками VBA на листе для удаления. А делал это как обычно.
    Возможно есть возможность отловить само событие удаления?

    Заранее спасибо!
    Автоматический ввод пароля при открытии запароленной книги
     
    Спасибо всем за ответы!
    Реализовал все-таки через стороннюю книгу, для которой создал ярлык и раздал всем пользователям.
    Автоматический ввод пароля при открытии запароленной книги
     
    Спасибо! Уже думал над этим вариантом... А без сторонней книги нельзя обойтись? для пользователя запуск книги должен остаться как и был, только без пароля. Иначе будет слишком сложно..
    Автоматический ввод пароля при открытии запароленной книги
     
    Добрый день!
    Имеется книга эксель не сетевом ресурсе с общим доступом. Каждый день она открывается различными пользователями и изменяется. Из-за суеверий начальства книга имеет сложный пароль. Как можно сделать так чтобы пароль для книги вводился автоматически при открытии книги для определенных пользователей?

    Главная проблема в том, что событие Private Sub Workbook_Open(), куда мы могли бы записать нужный код, происходит после того как приложение запрашивает пароль от книги.

    Заранее спасибо!
    Присвоение переменной форматирования ячейки
     
    ikki Да, вы правы, с отключением обновления экрана намного быстрее. Я уже использовал этот прием.
    Еще интересный факт по копированию:

    Код
    myRange.Copy [a2]
     
    примерно в 2 раза быстрее чем
    Код
    myRange.Copy  
    [a2].paste 
    
    Присвоение переменной форматирования ячейки
     
    Задача моя состоит в том чтобы, если пользователь изменял значение любой ячейки на листе, она заливалась синим цветом. Это не сложно.
    Сложность заключается в том, чтобы если он вернул первоначальное значение, нужно чтобы возвращалась первоначальная заливка.
    Пробовал делать вариант с созданием дополнительного листа при открытии книги. Но тут возникла проблема, если пользователь произведет сортировку или удалит  строки/столбцы, структура 2х листов уже не будет совпадать..
    The_Prist спасибо за код по копированию!
    Присвоение переменной форматирования ячейки
     
    Подскажите как сделать так чтобы переменная хранила значения и заливку, которые были при открытии книги?
    Я присваиваю переменной диапазон при открытии кинги:
    Код
    Sub Workbook_Open()
    Application.AskToUpdateLinks = False
    Application.DisplayAlerts = False
    Set myRange = Range(Cells(1, 1), Cells(2, 2))
    
    End Sub
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.DisplayAlerts = True
    Application.AskToUpdateLinks = True
    End Sub
     
    Далее работаю с листом:
    Код
    Sub Worksheet_Change(ByVal Target As Range)  
    Cells(3, 2).Interior.Color = myRange (1, 1).Interior.Color
    
    данный код (по моему представлению) должен при любом изменении на листе, возвращать в ячейку В3 заливку из ячейки А1.
    Ту которая была при открытии книги.
    Но если после открытия книги вручную поменять заливку ячейки А1, то при выполнении макроса в переменную myRange автоматически запишется новая заливка.

    P.s. в модуле прописана строка
    Код
    Public myRange As Variant
     
    Спасибо!
    Присвоение переменной форматирования ячейки
     
    Цитата
    Hugo пишет: Вообще от тормозов при копировании всех форматов никак не избавитесь.
    Спасибо за совет. Видимо придется прописать основные параметры  и этим ограничиться.
    Присвоение переменной форматирования ячейки
     
    Hugo, я попробовал ваш вариант:
    Код
    Sub macros1 ()
    Dim myRange As Variant
      Set myRange = [a1]
      [a2] = myRange
    End Sub
     
    В ячейку А2 перенеслось только значение из ячейки А1, заливка, шрифт и проч. - нет.
    Может я что-то не так делаю?

    как перенести все разом?
    Вижу только вариант прописывать отдельно заливку, цвет текста, и т.д., что также загромоздит код, если учитывать, шрифт, границы и проч.
    Код
    Sub macros1 ()
    Dim myRange As Variant
      Set myRange = [a1]
      [a2].Interior.Color = myRange.Interior.Color  
      [a2].Font.Color = myRange.Font.Color  
    End Sub
    Изменено: Sergey_batishev - 02.02.2015 18:03:27
    Страницы: 1 2 След.
    Наверх