К примеру, в документе макросом нужно найти казахское слово "Жұма":
Код
Sub search()
Cells.find(What:="Жұма", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Activate
End Sub
По идее, это элементарная задача, но проблема в том, что специфическая казахская буква "ұ" не отображается в редакторе: На первый взгляд, в этом случае поможет функция "ChrW()" и пошаговае покодовая разборка слова:
Код
ChrW(0416) & ChrW(04B1) & ChrW(043C) & ChrW(0430)
Всё бы ничего, но Excel "съедает" первые нули, превращая код в совершенно другой:
Код
ChrW(416) & ChrW(4B1) & ChrW(43C) & ChrW(430)
После чего, как следствие, ещё и ругаться начинает на встречу с неожиданными символами... Есть какие-нибудь идеи?
Любопытно, каким образом ASAP делает то же самое... Сейчас прошёлся им в одном из файлов - вообще никаких повреждений текста, при этом аккуратненько почикал всё ненужное...
Sub delete_numbers()
Cells.Replace What:="123", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
End Sub
2 (удаление первого пробела в ячейке):
Код
Sub delete_spaces()
Dim MyCell As Range
On Error Resume Next
Selection.Cells.SpecialCells(xlCellTypeConstants, 23).Select
For Each MyCell In Selection.Cells
MyCell.Value = LTrim(MyCell.Value)
Next
On Error GoTo 0
End Sub
Проблема макроса "1": значение "10/5" в ячейке меняет на "05.окт" и т.д. Проблема макроса "2": значение "10%" меняет на "0,1".
Каким волшебным образом можно отучить их пакостить? Настройки Excel перебрал - не помогает. Менял формат на текстовый - да, в этом случае изменений нет, но для всех ячеек изменить нельзя, а выборочно выделять ВСЕ проблемные ячейки - сам точно в этой жизни не успею, детям останется, да ещё и внукам хватит наверняка
Большое спасибо всем, задача была сделана ещё вчера, сегодня уже инициировал отчётный период (кто ж знал, что я всё успею ТАК быстро с этими вашими интернетами макросами)
У меня на первый взгляд вполне себе тривиальная задачка, но я и сам не смог её решить, и гугл после получасового прессинга так и не смог ничем мне помочь
Дано: куча данных, небрежно собранных в одном-единственном столбце. Задача: ускорить для читабельности (на носу проверки) банальным переносом однотипных данных (в моём случае - ответов) в соседний столбец. По картинкам, наверное, куда проще понять, что же мне нужно. Строки, подлежащие переносу, ВСЕГДА начинаются с нумерации (в моём случае в качестве нумерации используются буквы латинского алфавита и следующие за ними закрывающие скобки), при этом количество строк одного варианта ВСЕГДА равно 6.
Что сейчас:
Что нужно:
Помогите, пожалуйста, с макросом. Строк более 20000, плюс они разбросаны в нескольких файлах - мне так и недели не хватит на то, чтобы вручную это всё перебирать
Есть таблица: в ней есть подзаголовки и позиции. В настоящий момент приходится ручками присваивать id каждой позиции перед тем, как грузить в программу. Хотелось бы узнать у уважаемых знатоков, есть ли способ каким-нибудь хитрым макросом автоматизировать эту рутину?
Выглядит рутина так: получаю файл, в котором ячейки от A до K объединены в подзаголовки, а под каждым из них (в обычных ячейках) указаны позиции (количество позиций всегда варьируется от нуля до трёх сотен). Присваиваю в соответствии с эталонным списком каждому подзаголовку уникальный id (эталонный список вообще-то пока на бумаге, но я для примера указал его на закладке "список id") в столбце M, после чего тупо растягиваю id от одного подзаголовка до следующего - просто чтобы было видно, какая позиция к какой группе (т.е. подзаголовку) относится. Признаться, изрядно надоело. Но ума не приложу, как это можно автоматизировать, и можно ли вообще
Sanja написал: при такой конструкции: Like "Апасов К*" это и Апасов Константин и Апасов Кирилл и Апасов Кужегет...Кто из них на 100% нужен? Макрос сработает на первом, которого найдет в базе
"*" - это атавизм, его уже не будет в финале, так что можно не обращать внимания.
The_Prist написал: Ну вот наваял небольшой примерчик.
Благодарю! Сейчас посмотрю...
Цель - эти id идут дальше по "конвейеру". Экселя бы, если честно, в этой цепи не было, если бы не промежуточная сторонняя программа, способная выгружать только в xls. Так бы, конечно, всё было намного изящнее.
Здравствуйте, уважаемые. Один товарищ настойчиво отправлял меня к вам, и вот я здесь.
Суть: в некоем экселевском файле УЖЕ есть куча ФИО. Задача макроса сравнить эти ФИО с записями в БД, и в случае 100% совпадения вместо каждой ФИО прописать её уникальный id (то бишь соответствующий ей ordinal). Макрос, который я показываю - лишь один из нескольких (остальные занимаются предварительной косметикой, без которой никак нельзя: тримят, убирают пустые страницы, и прочее), но Excel падает только когда из MySQL вместо пары-тройки сотен приходит пара-тройка тысяч записей.
Как выглядит макрос в Delphi (чтобы было понимание, откуда что берётся):
Скрытый текст
Код
begin
Excel.Modules.Add(EmptyParam, EmptyParam, 1);
temp := 'Sub mymacros()' + #13;
temp := temp + 'Dim a As Workbook' + #13;
temp := temp + 'Dim lLastRow As Long' + #13;
temp := temp + 'Dim i As Long' + #13;
temp := temp + 'Set a = ThisWorkbook' + #13;
temp := temp + 'lLastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count' + #13;
temp := temp + 'Application.ScreenUpdating = False' + #13;
temp := temp + 'For i = lLastRow To 1 Step -1' + #13;
Query1.Open;
while not Query1.Eof do
begin
fio:=Query1.FieldByName('fio').AsString;
ordinal:=Query1.FieldByName('ordinal').AsString;
temp:=temp + 'if a.Sheets("sheet1").Cells(i, 6).Text like "' + fio + '*" then a.Sheets("sheet1").Cells(i, 6) = "' + ordinal + '"' + #13;
Query1.Next;
end;
temp:=temp + 'Next i' + #13;
temp:=temp + 'End Sub' + #13;
WorkBook.VBProject.VBComponents.Item(1).Codemodule.AddFromString(temp);
Excel.Run('mymacros');
CMod:=Excel.ActiveWorkbook.VBProject.VBComponents.Item(1).CodeModule;
StartLine:=CMod.ProcStartLine['mymacros', 0];
if StartLine > 0 then
begin
LineCount:=CMod.ProcCountLines['mymacros', 0];
CMod.DeleteLines(StartLine, LineCount);
end;
Query1.Close;
end;
Как выглядит код в VBA-редакторе:
Скрытый текст
Код
Sub mymacros()
Dim a As Workbook
Dim lLastRow As Long
Dim i As Long
Set a = ThisWorkbook
lLastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
Application.ScreenUpdating = False
For i = lLastRow To 1 Step -1
If a.Sheets("sheet1").Cells(i, 6).Text Like "Апасов К*" Then a.Sheets("sheet1").Cells(i, 6) = "157"
If a.Sheets("sheet1").Cells(i, 6).Text Like "Апатров У*" Then a.Sheets("sheet1").Cells(i, 6) = "166"
If a.Sheets("sheet1").Cells(i, 6).Text Like "Апацкий В*" Then a.Sheets("sheet1").Cells(i, 6) = "1958"
If a.Sheets("sheet1").Cells(i, 6).Text Like "Апдоров М*" Then a.Sheets("sheet1").Cells(i, 6) = "1509"
If a.Sheets("sheet1").Cells(i, 6).Text Like "Апеллесов Ю*" Then a.Sheets("sheet1").Cells(i, 6) = "340"
If a.Sheets("sheet1").Cells(i, 6).Text Like "Апель А*" Then a.Sheets("sheet1").Cells(i, 6) = "1261"
{тут ещё тысячи ФИО и их id}
Next i
End Sub
Проблема: когда пользователей было ~300 - всё было хорошо, макрос отрабатывал без единой ошибки, быстро и чётко. Но после расширения пользователей стало ~3000, и макрос выпадает с печально известной vba-ошибкой "procedure too large"
Как видите, я понятия не имею, каким образом можно сократить этот макрос, чтобы данная ошибка ушла и больше ко мне не возвращалась Спасибо за внимание.
Нужно удалить точку в конце строки. Засада в том, что точка в конце есть не во всех строках, на одной строке могут находиться несколько предложений (разделённых точками, которые удалять нельзя), а длина и количество всех предложений заранее неизвестна. Есть ли какое-нибудь решение для таких случаев?
В колонке "A" понадобилось убрать текст, находящийся в скобках, вместе с самими скобками. Текст без чёткой структуры/форматирования, т.е. внутри скобок может находиться любое количество любых символов в любом порядке. Скобки с текстом всегда находятся в конце предложения, иногда даже после знака препинания. Таблица с зелёной заливкой ("22.png" ;) - результат, который необходимо получить в итоге. Попробовал свои кривые руки в комбинации с одной небезызвестной надстройкой - не получилось. Посмотрел полное описание всех макросов и функций надстройки PLEX - тоже искомого в списке не нашёл :(
LVL пишет: Вы хотите копировать только данные или весь лист?
Только данные. Если бы весь лист - то и проблемы бы не было. А мне нужно именно данные (сама задача в реальности чуть сложнее, чем я тут её описал, просто я споткнулся именно на корректном выделении диапазона с данными).
Задача: выделить и перенести на новую страничку все данные, ничего не пропустив. Для этого открываю файл с данными и начинаю запись макроса. После этого по шагам: устанавливаю курсор в ячейку "A1" > нажимаю "Ctrl + A" (чтобы выделить вся область с данными) > копирую выделенную область в буфер > создаю в этой же книге новую страничку > устанавливаю курсор в ячейку "A1" > вставляю данные > останавливаю запись.
Всё бы ничего, вот только Excel чётко определил и указал диапазон, а это очень плохо в моей задаче Выходит, если в следующем файле записей будет больше, чем на 105 строк - он их просто не захватит. Как изменить код так, чтобы Excel, как говорится, немного "думал", т.е. интеллектуально определял диапазон с данными?
Надеюсь, это осуществимо, т.к. файлов нереально много и хотелось бы избавить себя от рутины, поэтому вся надежда на Вас