1795

Пингуем из Excel

Excel - это не только ВПР и дашборды, но и забавно, а иногда - бессмысленно и беспощадно.

На Youtube есть канал, где его автор творит в екселе всякие админские непотребства. Сейчас он дошёл до отправки в телеграм сообщений о результатах мониторинга.  Я иногда подбираю у него идеи, однако сильно чешусь в неприличных местах, когда вижу его код.

Увага: просмотр канала опасен для неокрепшей психики юных админов.

После просмотра видео, где он пингует список хостов, я подумал: а какого чёрта! И переписал это на свой лад.

Основная нагрузка - функция Ping

Function Ping(IP)

Ping = CreateObject("Wscript.Shell").Run("ping -n 1 -w 1000 " & IP, 0, True) = 0

End Function


Запускает внешний процесс, в котором выполняет собственно ping до нужного хоста.

В оригинале было так:

Весь остальной код - рюшечки вокруг этой функции: обход списка заданное количество раз, раскрашивание ячеек, ожидание паузы и проч.
Файл доступен по ссылке https://disk.yandex.ru/d/cA1XcK44Dx4uwQ

MS, Libreoffice & Google docs

783 поста15K подписчика

Правила сообщества

1. Не нарушать правила Пикабу

2. Публиковать посты соответствующие тематике сообщества

3. Проявлять уважение к пользователям

4. Не допускается публикация постов с вопросами, ответы на которые легко найти с помощью любого поискового сайта.

По интересующим вопросам можно обратиться к автору поста схожей тематики, либо к пользователям в комментариях


Важно - сообщество призвано помочь, а не постебаться над постами авторов! Помните, не все обладают 100 процентными знаниями и навыками работы с Office. Хотя вы и можете написать, что вы знали об описываемом приёме раньше, пост неинтересный и т.п. и т.д., просьба воздержаться от подобных комментариев, вместо этого предложите способ лучше, либо дополните его своей полезной информацией и вам будут благодарны пользователи.

Утверждения вроде "пост - отстой", это оскорбление автора и будет наказываться баном.

2
Автор поста оценил этот комментарий
А подскажите пожалуйста, с чего начать изучение vba? Есть какие-нибудь годные гайды?
раскрыть ветку (1)
4
Автор поста оценил этот комментарий

С появления интересной задачи, которую хочется решить во что бы то ни стало. Изучать просто так, на всякий случай, бессмысленно - VBA, с одной стороны, достаточно простой сам по себе язык, с другой - вся его суть - в применении к объектам данных в конкретной задаче. А этих объектов тьма-тьмущая.

В VBA можно решить (почти) любую задачу, причём множеством способов, так что выбрать задачу может непросто. А как только она появится - начинать над ней работать.

В ситуации когда прям вообще тупик и не знаешь что делать, вижу два пути: записать макрос для всех своих действий на листе и разобрать как оно работает, заугуглить "excel vba как ...." - и изучать полученные результаты. Спустя некоторое время придёт понимание как оно работает, а всё остальное - опыт и наработка типовых приёмов.

показать ответы
1
Автор поста оценил этот комментарий

Задача заполнение договора по таблице в эксель. Штатными средствами ворда сделал это, но нужно немного больше функций, вроде замены уважаемый на уважаемая и автоматическое добавление новых строк в ворде и их заполнение. Ну то есть чтобы по ключу "компания" он заполнял таблицу работников, добавляя нужные строки по необходимости. Готовых бесплатных решений не нашел, хотя может быть плохо искал :)

Сложная это задача для того, кто последний раз кодил лет 7 назад, да и то в паскале?) Задачу не надо прям обязательно решить, поэтому особо не парюсь и хотел бы просто найти какой-то годный "базовый" самоучитель, чтобы просто понять, стоит ли вообще лезть сюда или нет :)


Но в любом случае, спасибо за ответ.

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

В зависимости от объёма данных я бы рассмотрел вариант печати со слиянием:
в Word готовите шаблон с полями слияния, в Excel - чистые данные. Потом всё это сливается в Ворде  при помощи мастера слияния. Никакого кодинга не нужно.

показать ответы
Автор поста оценил этот комментарий

Я думал у нас тут коммунизм. А оказывается и тут деньги нужны.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Сделал, выложил в ту же папку https://disk.yandex.ru/d/cA1XcK44Dx4uwQ?w=1
Можно добавлять сколько угодно групп по три столбца. Главное, чтобы средний начинался на IP. Одним циклом считается обход всех столбцов с заголовком IP*.

Иллюстрация к комментарию
показать ответы
0
Автор поста оценил этот комментарий
Такой цирк тоже был. Справился аналогично - копирование -вставка- текстовый формат. А можно поподробнее пр способ решения? Надо руками функцию и формат писать?
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

В ворде в поле слияния прям руками дописываете: SHIFT+F9 (отобразить коды*значения полей) и вписываете в нужное место нужный формат.

показать ответы
1
Автор поста оценил этот комментарий

Кстати, раз вы занимаетесь сливанием документов. У меня на днях была проблемка. При сливании документа из Экселя в Ворд все даты конвертились в американский формат, то есть 1 марта 2021 отображалось как 3/1. В Экселе формат нормальный, в Ворде не разобрался как настроить. Пробовал на разных компах, с разными Офисами - один результат. Не сталкивались, случайно?
PS. Проблему решил костылями - скопировал все даты в текстовый файл, затем вставил их в столбец с форматом "Текст". Но на будущее хотелось бы нормальное решение.
@0617, может вы знаете?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Цирк при слиянии может быть не только с датами, но с рублями - 12,34 может превратиться в 12,340000000000000001. К счастью, с этим легко справиться:

Иллюстрация к комментарию
Иллюстрация к комментарию
показать ответы
3
DELETED
Вата горит
Автор поста оценил этот комментарий
Комментарий удален. Причина: Систематические нарушения правил ресурса
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Он всегда, по большому счёту, мог это всё. Никто ж не заставляет писать макросы, но почему бы и не использовать их для автоматизации на коленке - когда звать большого программиста для основной прикладухи не имеет смысла или просто невозможно, а сделать нужно.

1
Автор поста оценил этот комментарий

Ах и да, макросы можно записывать таким образом в разных приложениях? Ну типа одновременно и в ворде, и в экселе? Или запись только в одном будет работать?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Word и Excel работают со своей независимой копией VBA. Записывать макросы можно одновременно, в каждую копию VBA будут попадать только свои данные. Т.е. в Ворде мы не увидим действий екселя и наоборот. В этом есть логика: слишком разная объектная структура у программ.

показать ответы
5
DELETED
Автор поста оценил этот комментарий

Специально для минусаторов, которым лень со StackOverflow скопировать:

Все взял отсюда, чуть изменил, чтобы из листа удобнее обращаться было:

https://stackoverflow.com/questions/34678896/excel-vba-ping-...

Создал модуль, в модуль добавил

Option Explicit

Private Declare Function IcmpCreateFile Lib "icmp.dll" () As Long

Private Declare Function inet_addr Lib "WSOCK32.DLL" (ByVal cp As String) As Long

Private Declare Function IcmpCloseHandle Lib "icmp.dll" (ByVal IcmpHandle As Long) As Long

Private Declare Function IcmpSendEcho Lib "icmp.dll" _

(ByVal IcmpHandle As Long, _

ByVal DestinationAddress As Long, _

ByVal RequestData As String, _

ByVal RequestSize As Long, _

ByVal RequestOptions As Long, _

ReplyBuffer As ICMP_ECHO_REPLY, _

ByVal ReplySize As Long, _

ByVal timeout As Long) As Long

Private Type IP_OPTION_INFORMATION

Ttl As Byte

Tos As Byte

Flags As Byte

OptionsSize As Byte

OptionsData As Long

End Type

Public Type ICMP_ECHO_REPLY

address As Long

Status As Long

RoundTripTime As Long

DataSize As Long

Reserved As Integer

ptrData As Long

Options As IP_OPTION_INFORMATION

data As String * 250

End Type

Public Function Ping(strAddress As String) As Boolean

Dim hIcmp As Long

Dim lngAddress As Long

Dim lngTimeOut As Long

Dim strSendText As String

Dim Reply As ICMP_ECHO_REPLY

'Short string of data to send

strSendText = "blah"

' timeout value in ms

lngTimeOut = 1000

'Convert string address to a long

lngAddress = inet_addr(strAddress)

If (lngAddress <> -1) And (lngAddress <> 0) Then

hIcmp = IcmpCreateFile()

If hIcmp <> 0 Then

'Ping the destination IP

Call IcmpSendEcho(hIcmp, lngAddress, strSendText, Len(strSendText), 0, Reply, Len(Reply), lngTimeOut)

'Reply status

Ping = (Reply.Status = 0)

'Close the Icmp handle.

IcmpCloseHandle hIcmp

Else

Ping = False

End If

Else

Ping = False

End If

End Function


Ну и потом в ячейке пишем =ping("192.168.1.1")

Иллюстрация к комментарию
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Function Ping(IP)

     Ping = CreateObject("Wscript.Shell").Run("ping -n 1 -w 1000 " & IP, 0, True) = 0

End Function

1
Автор поста оценил этот комментарий

Ну часть проблем я описал в комменте выше. Типа нельзя сразу несколько строк из таблицы "вставить" в один документ (кроме копипаста), заменить склонение слов, взависимости от пола к примеру, взависимости от значений поля поменять структуры предложения, выделить инициалы и т. п. Часть проблем, конечно, можно решить через эксель, но это лишнее данные, с макросами я так понимаю можно сделать это куда проще и эффективнее, да и удобнее для юзера.

Но проблема у меня в том, что я вообще не понимаю как взаимодействать с "элементами" приложений/документов. Вот я и ищу (хотя и не особо рьяно) какой-нибудь хороший базовый гайд по основам VBA, чтобы просто в целом понять, стоит ли мне лезть в эти дебри :)


Для вас я думаю задача которая передо мной максимум на час, так что забейте)

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

1.Несколько строк - если имеется в виду, что в исходном списке каждая запись состоит из нескольких строк с одинаковым набором полей, то можно использовать поле слияния NEXT. На мой взгляд, это неправильно и противоречит идее - но технически это возможно.
2. Склонение слов - автоматически никак, в екселе должен быть столбец "Пол", и тогда его можно использовать поле слияния IF. Или отдельное поле для окончания (ый/ая/ые/ое) и тогда в ворде пишем "Уважаем" и вставляем поле.

3. Структуры - навскидку не скажу, никогда не сталкивался. Вероятно можно также при помощи IF.

4. Инициалы - насколько я понимаю, нужно первую букву слова делать отличной от остальных. В голову ничего не приходит.

Как взаимодействовать с элементами - включаешь запись макроса, делаешь в программе элементарное действие, останавливаешь запись и смотришь на записанный макрос.
Если есть возможность установить старый Офис 2003, то это было бы полезно для изучения: это последняя версия со встроенной справкой которая очень быстро работает. Начиная с 2007 и дальше - справка только онлайн, к тому же с автоматическим переводом. А в смысле VBA ничего не изменилось.

Иллюстрация к комментарию
показать ответы
0
Автор поста оценил этот комментарий
Поправка: не Shift а Альт.
Заново пришлось делать, вот и искал среди старых комментов )
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

В Ping.xlsm я бы цикл как-то так написал:
For Each cc In Range(Cells(2, 2), Cells(2, 2).End(xlDown))
Если я захочу что-нибудь внизу написать, какую-нибудь заметку, то твой цикл сломается.

Вместо LoopTimeout t0, timeout лучше написать
Application.Wait DateAdd("s", S, Now)
Эта функция не грузит процессор, как твоя.

Вот так бы написал, а не через + и CStr: "TESTING loop " & loops
И поменьше бы писал в одну строку. Что объявлений, что присваиваний, что условий это касается.

Ну, и сам нового немного узнал: UsedRange и Like в условии. Тоже польза.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

1. Можно и так, я не очень люблю размещать разнородную информацию в таблицах, поэтому не забочусь  о наличии чего-то, что не является данными. С другой стороны, End(xlDown)  остановится на пустой ячейке - "а вдруг мне захочется что-то удалить"? Также можно использовать CurrentRegion на любой ячейке - аналогично нажатию CTRL + * выделят непустой прямоугольник вокруг заданной ячейки.

2. Можно и так. Да, не грузит, но при этом Excel "замерзает" и не обновляет экран. При более или менее долгой паузе получаем белый прямоугольник и панику у пользователя :"А-а-а всё зависло!". В моём случае можно вставить любой индикатор прогресса - хоть форму. хоть в ячейку проценты писать. А загрузка... Да и чёрт с ней.

3. Виновен ;)

4. В одну строчку я объединяю операторы, которые выполняют более или менее однородный блок действий, своего рода подпрограмма. Насчёт читаемости - с одной стороны, это слегка её затрудняет, с другой - делает листинг короче, что повышает читаемость.

0
Автор поста оценил этот комментарий
Спасибо, пригодился файл) Может еще подскажешь, как выводить отоьрадение мак адреса рядом с айпишником?)
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Возможно, как-нибудь через

arp -a 10.134.59.2
перехватить и обработать вывод

Иллюстрация к комментарию
0
Автор поста оценил этот комментарий

Теперь понятно, спасибо. Интересно через сколько упадет Excell теперь если поставить ему боевую задачу. Мне кажется это неплохая вещь чтобы быстро просканировать сеть. Типа IP сканер

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Из очевидного - если за время одного цикла изменится системное время - скажем, переход на летнее/зимнее время - может быть лишняя пауза. А так, вроде бы, не с чего ему падать. В любом случае - запустить и посмотреть на результат. Сам по себе процесс не деструктивный, так что ничего страшного не должно быть.

0
Автор поста оценил этот комментарий

For IPgroup = 1 To UsedRange.Columns.Count //это константа или переменая почему 1?

If Cells(1, IPgroup) Like "IP*" Then //тут он использует поиск по первому ряду или по всей таблице?

For Each cc In UsedRange.Offset(1, IPgroup - 1).Resize(UsedRange.Rows.Count - 1, 1).Cells

If cc <> "" Then //а это вообще что за хрень?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

For IPgroup = 1 To UsedRange.Columns.Count
Цикл - переменная IPgroup принимает значения от 1 количества столбцов в дапазроне с данными.
If Cells(1, IPgroup) Like "IP*" Then
Если значение ячейки в строке 1 и столбце IPgroup соответствует шаблону.
For Each cc In UsedRange.Offset(1, IPgroup - 1).Resize(UsedRange.Rows.Count - 1, 1).Cells

Для каждой ячейки диапазона.

If cc <> "" Then
Если ячейка пустая.

показать ответы
Автор поста оценил этот комментарий
А как такое сделать?
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Чуть позже сделаю. Пока сто рублей приготовьте ;)

показать ответы
Автор поста оценил этот комментарий
Хочу чтобы было несколько столбцов с ip
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Что-то типа такого?

Иллюстрация к комментарию
показать ответы
0
Автор поста оценил этот комментарий

@0617 я понял что менять что-то здесь, а вот что на что и как добавить

For Each cc In UsedRange.Offset(1, 1).Resize(UsedRange.Rows.Count - 1, 1).Cells

With cc.Offset(0, 1)

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

В общем, да. Можно использовать любой цикл, обходящий нужный диапазон. Конкретная реализация зависит от того, как вы хотите использовать результат.

показать ответы
0
Автор поста оценил этот комментарий

@0617, а как добавить еще столбцы с IP шниками? Чтобы не только в Ц считался А скажем в H?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Я бы не советовал делать множество столбцов с исходными данными - я не вижу как это можно потом использовать.

0
Автор поста оценил этот комментарий

Да, я так и сделал. Но функций мастера слияния не совсем хватает.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

А чего именно не хватает? Надо подумать как это исправить.

показать ответы
2
DELETED
Автор поста оценил этот комментарий

Ну и в чем тут сложность? Тупейший способ. Учитывая, что в  vba  можно обращаться к внешним апи, кто мешает просто задекларировать и вызвать функцию IcmpSendEcho из  advapi.dll?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Сложностей никаких. Почти любую задачу можно решить множеством разных способов.
Приведите код вашего способа, обсудим.

показать ответы
1
Автор поста оценил этот комментарий

Сколько времени эта хрень будет пинговать 65к хостов? Вопрос реально нужный.

раскрыть ветку (1)
Автор поста оценил этот комментарий

В качестве грубой оценки - за сутки справится. Но зачем?
Для таких объёмов нужные другие инструменты.

показать ответы

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества