Sub c_date()
Set range1 = Intersect(ActiveWindow.RangeSelection, ActiveSheet.UsedRange)
For Each cell In range1
If IsDate(cell.Value) Then cell.Value = CDate(cell.Value)
Next cell
End Sub
Как вариант, макрос задающий формат "дата" для выделенных ячеек, для удобства можно вынести макрос на панель быстрого доступа:
Код
Sub c_date()
Set range1 = Intersect(ActiveWindow.RangeSelection, ActiveSheet.UsedRange)
For Each cell In range1
If IsDate(cell.Value) Then cell.Value = CDate(cell.Value)
Next cell
End Sub
'задать формат "дата" для ячеек (выделенного диапазона)
Sub format_date()
Set range1 = Intersect(ActiveWindow.RangeSelection, ActiveSheet.UsedRange)
For Each cell In range1
If IsDate(cell.Value) Then cell.Value = CDate(cell.Value)
Next cell
End Sub
При любой последовательности запуска (сначала макрос, потом книга или сначала книга, потом макрос) появляется ошибка в Ln 34, Col 21: Run-time error '1004': Method 'SaveAs' of object '_Worksheet' failed
Помогите зациклить. Код, приведенный Doober работает, но лишь один раз, когда книга содержащая в имени "123" уже открыта. Не могу зациклить, пробовал так: Добовляю Sleep
Код
Private Declare Sub Sleep Lib "kernel32" (ByVal lngMilliSeconds As Long)
Код
Sub Inf_loop()
Dim n As Integer
n = 0
Do
Sleep 100
DoEvents
Call Терминатор
Sleep 100
DoEvents
Loop Until n = 1
End Sub
пытаюсь открыть "123" - не открывается, никаких действий не происходит.
Уважаемые профи! Помогите пожалуйста автоматизировать сохранение вновь созданной книги. Есть стороннее ПО из которого данные передаются в приложение Еxcel в формате книги .xls (2003). Поскольку при этом в окне Excel не подгружаются установленные надстройки (в том числе личная книга макросов - personal.xlsb) делаю вывод, что новое окно (приложение) Excel запускается в режиме автоматизации. Проблема описана вот в этой теме (архив): http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=8&TID=24346 Появились ли какие-то иные (новые) способы решения проблемы? Конкретно моя задача такая. При появлении новой книги с экспортированными из стороннего ПО данными, программно сделать следующее: Отследить появление книги и сохранить её, но уже в 2007 формате (.xlsx) с именем файла из ячейки A1 первого листа, по заданному мной пути, например H:\, и закрыть эту книгу и приложение Excel в котором она появилась. И зациклить это дело, т.е. при экспорте книга должна сразу без манипуляций со стороны пользователя сохраняться по требуемому пути и закрывать приложение Excel в котором она создана не трогая другие открытые книги (вообще во время работы этого цикла нужно чтобы была всегда открыта ещё 1 книга из файла) и далее по циклу. Задача облегчается тем, что имя (и путь к файлу) открытой книги не меняется и заранее известно ("AlwaysOpen"), а имя появляющихся книг всегда содержит текст "123" Желательно это сделать штатными средствами, доступными в Windows 7 + Excel 2007, через VBA (не нашел, что VBA такое позволяет), PowerShell, VBScript, JScript и т.п. Сам нашел такие варианты кода под похожие задачи: 1) VBScript, отслеживание нового процесса Excel и закрытие его, но мне не удалось модифицировать код под мою задачу, как я понял процесс нельзя привязать к COM-объекту Excel (поправьте если не прав):
Код
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colMonitoredProcesses = objWMIService.ExecNotificationQuery("SELECT * FROM __InstanceCreationEvent " _
& " WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'")
i = 0
Do While i = 0
Set objLatestProcess = colMonitoredProcesses.NextEvent
If objLatestProcess.TargetInstance.Name = "EXCEL.EXE" Then
objLatestProcess.TargetInstance.Terminate()
End If
Loop
2) VBScript, при одноразовом применении на уже созданной книге работает, но не удалось зациклить и добиться отслеживания вновь создаваемых книг и почему-то код закрывает все книги, а не только ту, где есть "123" в имени книги:
Код
On Error Resume Next
Dim objXL, WB
Set objXL = GetObject(, "Excel.Application")
Set WB = objXL.ActiveWorkbook
If Not TypeName(objXL) = "Empty" Then
If Not TypeName(WB) = "Nothing" Then
If Instr(1, objXL.ActiveWorkbook.Name, "123", vbTextCompare) > 0 then
objXL.ActiveWorkbook.SaveAs "H:\" & objXL.ActiveWorkbook.Worksheets(1).Cells(1, 1).Value & ".xlsx"
objXL.ActiveWorkbook.Close
objXL.Application.Quit
End If
End If
End If
Вы же писали, я и отвечаю, что да, возможно через SQL. Не таблицы в Excel форматировать, я про то, что в SQL можно сконструировать запрос, который вернет нужные Вам данные в требуемом виде.
Уточните задачу. В разных столбцах могут быть разные данные, т.е.может, например, быть - Г/9, 7, Р, пусто? Число в ячейках где буква/число - какие могут быть числа (дву- тре- значные, натуральные, вещественные)?
В Excel 2007 возвращает не "0", а "-5,55112E-17", ноль будет если поставить числовой формат. В Excel беда с числами с плавающей запятой, формулу ОСТАТ лучше не использовать с делителем < 1. Можно посоветовать заменить формулу "ОСТАТ" на вариант с "ЦЕЛОЕ", в Вашем случае =10-(ЦЕЛОЕ(10/0,01)*0,01) для ячеек A1 и B1: ОСТАТ(A1;B1) = A1-(ЦЕЛОЕ(A1/B1)*B1)
Как вариант эту задачу можно решить хитрым способом, не городя макросов: так как длина строки не сильно варьируется, можно просто подобрать размер ячейки чтобы влезали все имеющиеся или предполагаемые суммы, а дальше просто ссылкой на исходные ячейки применять любое форматирование, чтобы четко все было можно поиграться с выравниванием.
Jack Famous, это ZVI спасибоза такое чудо, судя по датам сообщений он её на протяжении нескольких лет модифицировал по пожеланиям форумчан, там в теме аж 8 версий выложено. Вообще в закромах форума очень много полезных вещей, причем универсальных, достойных включения в копилку идей - http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=list&FID=2