Microsoft Office обнаружил возможное нарушение безопасности. Корпорация Майкрософт заблокировала запуск макросов, так как источник этого файла не является доверенным
visors16 написал: Где кнопка разблокировки в свойствах файла ?
А я разве на этом акцентировал внимание? Эта кнопка бывает доступна, по моим наблюдениям, когда файл скачан из интернета, а для Вашего случая, я думаю можно попробовать доверенные источники.
Option Explicit
Sub Поиск_во_всех_файлах()
Dim iShtName$, iPath, iPathArr, iFileName$, firstAddress$
Dim iSheet As Worksheet, iFoundSht As Worksheet
Dim iTempWB As Workbook, iBazaWB As Workbook
Dim TextToFind As Variant, iFoundRng As Range
Dim iLastRow&
Dim FoundAny As Boolean
TextToFind = Application.InputBox("Введите текст для поиска:", "Поиск")
If TextToFind = "" Or TextToFind = False Then Exit Sub
TextToFind = Trim(TextToFind)
'Здесь пути к Вашим папкам, нужен слеш в конце
iPathArr = Array("D:\ExcelFolder\", "D:\ExcelFolder2\")
For Each iPath In iPathArr
Workbooks.Add
Sheets.Add.Name = "Поиск"
Set iFoundSht = ActiveSheet
iFoundSht.Cells(1, 1) = "Ищем: " & TextToFind
iFoundSht.Cells(1, 1).Font.Bold = True
With Application
.ScreenUpdating = False
.Calculation = xlManual
.StatusBar = "Идёт поиск..."
.ShowWindowsInTaskbar = False
iFileName = Dir(iPath & "*.xls")
Do While iFileName$ <> ""
Set iTempWB = Workbooks.Open(Filename:=iPath & iFileName, UpdateLinks:=False, ReadOnly:=True)
For Each iSheet In iTempWB.Sheets
If iSheet.FilterMode = True Then iSheet.ShowAllData
Set iFoundRng = iSheet.Cells.Find(What:=TextToFind, LookIn:=xlFormulas, LookAt:=xlPart)
If Not iFoundRng Is Nothing Then
FoundAny = True
firstAddress = iFoundRng.Address
Do
With iFoundSht
iLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
If iLastRow = 1 Then iLastRow = 2
If iShtName <> iSheet.Name Then 'если новый файл
With .Cells(iLastRow + 2, 1)
.Value = "Файл: " & iTempWB.Name & ", Лист: " & iSheet.Name
.Font.Bold = True
End With
End If
iFoundRng.EntireRow.Copy Destination:=.Cells(.Cells(.Rows.Count, 1).End(xlUp).Row + 1, 1) 'копируем всю строку
iShtName = iSheet.Name
End With
Set iFoundRng = iSheet.Cells.FindNext(iFoundRng)
Loop While iFoundRng.Address <> firstAddress
Else
End If
Next
iTempWB.Close SaveChanges:=False
iFileName = Dir
Loop
.StatusBar = False
.ShowWindowsInTaskbar = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With
If FoundAny = False Then
MsgBox "Текст '" & TextToFind & "' ни в одном из файлов в папке:" & Chr(10) & iPath & Chr(10) & " не был найден!", 48, "Отчёт"
iFoundSht.Parent.Close SaveChanges:=False
Exit Sub
End If
Next iPath
MsgBox "Поиск " & TextToFind & " завершён!", 64, "Поиск"
End Sub
Цитата
RUSBelorus написал: Не осилить, сори. Останусь с вариантов одного пути.
Быстро Вы сдались. Если б написали сразу всю задачу, то и решилось бы все сразу, а то Вы сначала одно, а потом еще один бонус...
Sub checkValidation()
Dim cell As Range, v As Long
For Each cell In Selection.Cells
v = 0
On Error Resume Next
v = cell.SpecialCells(xlCellTypeSameValidation).Count
On Error GoTo 0
If v = 0 Then
Debug.Print cell.Address & ": no validation"
Else
Debug.Print cell.Address & ": has validation"
End If
Next
End Sub
Нашел и немного допилил код, который реагирует на выделение/вставку картинки на лист. В данном файле-примере при вставке или выделении картинки, картинка "переносится" с лист1 на лист2.
Код в модуль книги
Код
Option Explicit
Private WithEvents cmbrs As CommandBars
Private Sub Workbook_Activate()
Set cmbrs = Application.CommandBars
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Set cmbrs = Application.CommandBars
End Sub
Private Sub cmbrs_OnUpdate()
Call ManipulateImage
End Sub
Private Sub ManipulateImage()
Dim shp As Shape, shpPosition As String, shpName As String, shpCheck As Shape
Set shp = GetShape
If Not shp Is Nothing And ActiveSheet.Index = 1 Then
shpName = shp.Name
For Each shpCheck In Worksheets(2).Shapes
If shpCheck.Name = shpName Then
End
End If
Next shpCheck
Let shpPosition = shp.TopLeftCell.Address(0, 0)
shp.Copy
shp.Delete
Worksheets(2).Activate
Worksheets(2).Paste Range(shpPosition)
Worksheets(1).Activate
'Worksheets(2).Shapes(Worksheets(2).Shapes.Count).Name = shpName
End If
End Sub
Private Function GetShape() As Shape
If TypeName(Selection) = "Picture" Then Set GetShape = Application.Selection.ShapeRange.Item(1)
End Function
Или думается нужно выделять картинки, а не диапазон, первую выделяем через правый клик, потом можно Ctrl+A, или с зажатым Ctrl выделять нужные. _______ UPD: Кодом удаляется, а через выделение нет.
Sub Insert_tab3_1()
ActiveSheet.Shapes(Application.Caller).TopLeftCell.Offset(0, 2).Value = Range("J32").Value
End Sub
Sub Clear_Insert_tab3_1()
ActiveSheet.Shapes(Application.Caller).TopLeftCell.Offset(0, -2).Value = ""
End Sub
А как? На чем проверять? От Вас файла примера нету(согласно 2.3)...
Цитата
Sanja написал: Удаление строк нужно производить от конца к началу
Код
Sub DeleteRows()
Dim lastRow As Long, i As Long
Application.ScreenUpdating = False
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = lastRow To 1 Step -1
If Cells(i, 1).Value = "x" Then Cells(i, 1).EntireRow.Delete Shift:=xlShiftUp
Next i
End Sub
В версиях Excel старше 2010 работает только системный вариант двух окон рядом. А именно: открываем два файла, находясь в одном из них нажимаем Win + стрелка вправо и потом выбираем другое доступное окно.
Все дело было в дополнительном параметре Type:=xlFillCopy
Код
Sub UnMergeAndFillCells()
Dim cell As Range, tempRange As Range, firstCellAddress As String
Application.ScreenUpdating = False
For Each cell In ActiveSheet.UsedRange.Cells
If cell.MergeCells And cell.MergeArea.Columns.Count = 1 Then
firstCellAddress = cell.Address(0, 0)
Set tempRange = cell.MergeArea
cell.UnMerge
Range(firstCellAddress).AutoFill Destination:=tempRange, Type:=xlFillCopy
ElseIf cell.MergeCells And cell.MergeArea.Columns.Count > 1 Then
cell.UnMerge
cell.WrapText = False
If Not IsNumeric(cell.Value) Then
cell.HorizontalAlignment = xlLeft
End If
End If
Next cell
End Sub
Sub UnMergeAndFillCells()
Dim cell As Range, tempRange As Range, firstCellAddress As String
Application.ScreenUpdating = False
For Each cell In ActiveSheet.UsedRange.Cells
If cell.MergeCells And cell.MergeArea.Columns.Count = 1 Then
firstCellAddress = cell.Address(0, 0)
Set tempRange = cell.MergeArea
cell.UnMerge
Range(firstCellAddress).AutoFill Destination:=tempRange
End If
Next cell
End Sub
Alisa103, приложите два файла-примера, согласно правилам, т.е. книгу для ввода данных и ту другую книгу в которую данные копируются, чтобы структура файлов соответствовала реальным файлам, может с помощью макросов что и получится решить...
Без имён книг, макрос должен быть в книге-исходнике. Т.е., исходник нужно пересохранить с поддержкой макросов и поместить туда этот макрос:
Код
Sub CopyTable()
Dim wbSource As Workbook, wbDestination As Workbook
Dim myTable As Range, myNewTable As Range, Cell As Range
Application.ScreenUpdating = False
Set wbSource = ThisWorkbook
Set myTable = wbSource.Worksheets(1).Range("A2").CurrentRegion
Set wbDestination = Workbooks.Add
myTable.Copy
wbDestination.Worksheets(1).Range("A1").PasteSpecial xlPasteColumnWidths
wbDestination.Worksheets(1).Range("A1").PasteSpecial xlPasteValues
wbDestination.Worksheets(1).Range("A1").PasteSpecial xlPasteFormats
Set myNewTable = wbDestination.Worksheets(1).Range("A2").CurrentRegion
For Each Cell In myTable
myNewTable.Range(Cell.Address).Interior.Color = Cell.DisplayFormat.Interior.Color
Next Cell
myNewTable.Cells(1, 1).Select
Application.CutCopyMode = False
End Sub
В результате получаем новую книгу, которую нужно вручную сохранить в нужном Вам месте. Хотя и это можно автоматизировать.
Sub CopyTable()
Dim wbSource As Workbook, wbDestination As Workbook
Dim myTable As Range, myNewTable As Range, Cell As Range
Application.ScreenUpdating = False
Set wbSource = Workbooks("Так есть.xlsx")
Set myTable = wbSource.Worksheets(1).Range("A2").CurrentRegion
Set wbDestination = Workbooks("Destination Book.xlsm")
myTable.Copy
wbDestination.Worksheets(1).Range("A1").PasteSpecial xlPasteColumnWidths
wbDestination.Worksheets(1).Range("A1").PasteSpecial xlPasteValues
wbDestination.Worksheets(1).Range("A1").PasteSpecial xlPasteFormats
Set myNewTable = wbDestination.Worksheets(1).Range("A2").CurrentRegion
For Each Cell In myTable
myNewTable.Range(Cell.Address).Interior.Color = Cell.DisplayFormat.Interior.Color
Next Cell
myNewTable.Cells(1, 1).Select
Application.CutCopyMode = False
End Sub
От фонаря, чтобы не было пусто, пока разбирался что куда там копируется временно написал, чтобы видеть будут ли изменения. ___ Перекачал файл проверил, вроде работает нормально без потерь колонок.
Sub Макрос1()
A = Sheets("Лист1").Cells(2, 1).Value
Set Rng = Sheets("Sheet1").Columns(2).Find(A, LookIn:=xlValues, LookAt:=xlWhole)
If Not Rng Is Nothing Then
myRow = Rng.Row
End If
For i = 2 To Sheets("Лист1").Cells(2, Columns.Count).End(xlToLeft).Column
B = Sheets("Лист1").Cells(2, i).Value
Set Rng1 = Sheets("Sheet1").Rows(1).Find(B, LookIn:=xlValues, LookAt:=xlWhole)
If Rng1 Is Nothing Then
Set Rng1 = Sheets("Sheet1").Rows(1).Find(Split(B, " ")(0), LookIn:=xlValues, LookAt:=xlPart)
If Not Rng1 Is Nothing Then
Sheets("Sheet1").Columns(Rng1.Column + 1).Insert
Sheets("Sheet1").Cells(1, Rng1.Column + 1) = Sheets("Лист1").Cells(2, i)
Sheets("Sheet1").Cells(2, Rng1.Column + 1) = Sheets("Лист1").Cells(3, i)
Sheets("Sheet1").Cells(3, Rng1.Column + 1) = Sheets("Лист1").Cells(4, i)
Else
x = Sheets("Sheet1").Cells(1, Columns.Count).End(xlToLeft).Column
Columns(x + 1).Insert
Sheets("Sheet1").Cells(1, x + 1) = Sheets("Лист1").Cells(2, i)
Sheets("Sheet1").Cells(2, x + 1) = Sheets("Лист1").Cells(3, i)
Sheets("Sheet1").Cells(3, x + 1) = Sheets("Лист1").Cells(4, i)
End If
Else
myColumn = Rng1.Column
Sheets("Sheet1").Cells(myRow, myColumn) = Sheets("Лист1").Cells(4, i)
End If
Next i
End Sub
Sub HideRibbon()
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"", False)"
Call FitTable
End Sub
Sub ShowRibbon()
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"", True)"
DoEvents
Call FitTable
End Sub
Sub FitTable()
Range("B1").CurrentRegion.Select
ActiveWindow.Zoom = True
Range("B1").Select
End Sub
Как с помощью макроса сохранить и закрыть книгу Excel, Макрос открывает все книги, но не закрывает и не сохраняет изменения, не хватает знаний грамотно дописать код
А Вы про файл(ы)-пример(ы) читали 2.3? Я не могу протестировать код без файлов. Приложите 2-3 файла согласно правилам форума тогда будет работать, но полюбому путь к файлам Вы сами должны будете прописать в коде.
Доработанный вариант, будет работать только при включенных макросах. Весь код внутри формы. WorkBook_Open только открывает форму. Пароль 4, на случай если сразу включите макросы. ___ UPD: Вот обновленный файл с письма:PasswordSheet.xlsm(31.91 КБ) ___ UPD: Тест открытия.xlsm(38.71 КБ)
Как с помощью макроса сохранить и закрыть книгу Excel, Макрос открывает все книги, но не закрывает и не сохраняет изменения, не хватает знаний грамотно дописать код
Sub Create()
Dim i As Integer, sFolder As String, sFiles As String
sFolder = "путь к папке"
sFiles = Dir(sFolder & x & "extr_*")
Do While sFiles <> ""
Workbooks.Open sFolder & sFiles
sFiles = Dir
For i = 1 To Sheets.Count
If Sheets(i).Name Like "extr_*" Then
Sheets(i).Name = "Лист1"
End If
Next i
ActiveWorkbook.Close SaveChanges:=True
Loop
End Sub
Помогите: Как сконвертировать из 10-ой системы в ieee 754 ?, Нужно чтобы так же было и в exel - в одну строчку ввожу цифру - из другой выходное значение.
Назар Скалат написал: добавить 18 и поменять 98 на 116?
В одной строке помещается 4-е матча. Если добавить 18, то получим 3(18/6) строки в каждой по 4-е и того получится 12 свободных мест для записей. Все происходит точно также, как Вы делали вручную, берем одну строку с матчами(в Екселье это группа из 5-ти строк) и идем слева на право, дошли до конца строки, опускаемся ниже на 6 екселевских строк и.т.д... То есть добавив 1 раз 6, мы получаем место для 4-х матчей.