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

Страницы: 1
Определение расстояния от А до Б по дороге на автомобиле по координатам., макрос в UDF
 
Например для данной ф-ции можно прописать:
Код
Application.MacroOptions Macro:="РАССТОЯНИЕ", _
Description:="Определяет по GoogleMaps расстояние по дороге между пунктами А и Б (заданных координатами)", _
Category:=9
попробовал добавить - нет
Изменено: Олег З - 21.10.2017 21:35:15
Определение расстояния от А до Б по дороге на автомобиле по координатам., макрос в UDF
 
Саня, это я переименовал ф-цию в "Расстояние"
После удаления строки Cell(3,1) = URL - всё заработало.
Работает не очень быстро, т.к. запрос-ответ-парсинг занимает время. Но скорость и не требуется.

На всякий - вот рабочий вариант ф-ции определения расстояния "по дороге на автомобиле" между двумя точками по координатам

Еще бы "причесать" ее и избавить от префикса.
Я так понял, что надо
Цитата
воспользоваться методом MacroOptions об'екта Application
Синтаксис же этого метода такой :

 Sub MacroOptions([Macro], [Description], [HasMenu], [MenuText],  [HasShortcutKey], [ShortcutKey], [Category], [StatusBar],  [HelpContextID], [HelpFile])
вот только куда эти строки вставлять?
Код
Function Расстояние(a1, b1, a2, b2)
Dim a$, b$, distance$, XMLDoc As Object
 a = b1 & "%2C" & a1 ' широта и долгота (А1 и В1)
 b = b2 & "%2C" & a2 ' широта и долгота (А2 и В2)
 Dim firstVal As String, secondVal As String, lastVal As String
 firstVal = "http://maps.googleapis.com/maps/api/distancematrix/xml?origins="
 secondVal = "&destinations="
 lastVal = "&mode=car&language=ru&sensor=false"
 URL = firstVal & Replace(a, ",", ".") & secondVal & Replace(b, ",", ".") & lastVal
 Set XMLDoc = CreateObject("Microsoft.XMLDOM")
 XMLDoc.Load URL
 Do While XMLDoc.readyState <> 4
 DoEvents
 Loop
 Расстояние = XMLDoc.SelectSingleNode("//distance/value").Text
End Function

[CODE][/CODE]
Изменено: Олег З - 21.10.2017 20:47:37
Определение расстояния от А до Б по дороге на автомобиле по координатам., макрос в UDF
 
увы не работает
макрос работает, а UDF - нет
44,48923948,75664
44,5304948,74153
http://maps.googleapis.com/maps/api/distancematrix/xml?origins=48.75664%2C44.489239&destinat...
9147
=PERSONAL.XLSB!Расстояние(A1;B1;A2;B2)
Определение расстояния от А до Б по дороге на автомобиле по координатам., макрос в UDF
 
Прошу помощи у гуру VBA: наконец-то получилось слепить работающий макрос определения расстояния от А до Б по дороге на автомобиле (парсит ответ гугла) по координатам.
Хочу преобразовать данный макрос в UDF, но ничего не получается. Хэлп!
И еще хотелось бы поместить UDF в PERSONAL.XLSB, но что бы формула вызывалась без префикса "PERSONAL.XLSB"
Код
Sub Getdistance()

Dim a$, b$, distance$, XMLDoc As Object
 a = Cells(1, 2) & "%2C" & Cells(1, 1) ' широта и долгота (А1 и В1)
 b = Cells(2, 2) & "%2C" & Cells(2, 1) ' широта и долгота (А2 и В2)
 
 Dim firstVal As String, secondVal As String, lastVal As String
 firstVal = "http://maps.googleapis.com/maps/api/distancematrix/xml?origins="
 secondVal = "&destinations="
 lastVal = "&mode=car&language=ru&sensor=false"
 URL = firstVal & Replace(a, ",", ".") & secondVal & Replace(b, ",", ".") & lastVal
 Cells(3, 1) = URL
 Set XMLDoc = CreateObject("Microsoft.XMLDOM")
 XMLDoc.Load URL
 Do While XMLDoc.readyState <> 4
 DoEvents
 Loop
 distance = XMLDoc.SelectSingleNode("//distance/value").Text
 ' MsgBox "Расстояние " & distance & " метров :)"
 Cells(4, 1) = distance
 
End Sub
Гиперссылка на динамический диапазон в динамическом диапазоне, Поиск диапазона значений, выбор поддиапазона и формирование ссылки на него
 
пока решил пойти на "костылях" - добавил столбец и вышеозначенной формулой выполняю переход.

но функция ЯЧЕЙКА является "летучей", а в формуле их 2. количество таких ссылок на листе перевалило за 700 и стали ощутимы тормоза (эксель замирает при любом малейшем действии). приходится принести в жертву гибкость ради скорости - убил эту конструкцию и заменил конкретным указанием имени файла.
Скрытый текст
Изменено: Олег З - 02.03.2017 23:16:32
Гиперссылка на динамический диапазон в динамическом диапазоне, Поиск диапазона значений, выбор поддиапазона и формирование ссылки на него
 
ищем значение из первого столбца на листе Список в первом столбце листа База, определяем высоту диапазона всех совпадающих значений, формируем ссылку на этот диапазон. При переходе по ссылке мы попадаем на втрой лист, где уже выбран диапазон ячеек с такими же значениями в первом столбце.
Но проблема в том, что бывают моменты, когда необходимо ограничить выбор диапазона на втором листе по совпадению значения во втором столбце.

Понимаю, что самое простое решение - сформировать столбец значений А+В и работать с ним (на первом листе я уже сделал такой столбец для других целей. Но хочется красивого решения, а не очередной "костыль".
Гиперссылка на динамический диапазон в динамическом диапазоне, Поиск диапазона значений, выбор поддиапазона и формирование ссылки на него
 
Прошу помощи у уважаемых знатоков. Есть файл из 2-х листов: 1-й лист с перечнем значений, а на втором листе развернутая база. Необходимо на первом листе сформировать ссылку на ячейки базы, удовлетворящие 2-м условиям с первого листа.
Осложняющие обстоятельства:
1. файл в локальной сети
2. файл не должен содержать макросов
3. файл Общий

С помощью интернета смог родить только половину задачи, т.е. сформировать ссылку на диапазон ячеек, удовлетворящих одному условию (Документ), но найти в этом диапазоне значения удовлетворящие второму (Позиция) условию - ХЗ.
Код
=ГИПЕРССЫЛКА(ПСТР(ЯЧЕЙКА("имяфайла";База!A1);ПОИСК("[";ЯЧЕЙКА("имяфайла";База!A1));256)&"!"&АДРЕС(ПОИСКПОЗ(A2;База!$A$1:$A$10000;0);1)&":"&
АДРЕС(ПОИСКПОЗ(A2;База!$A$1:$A$10000;0)+СЧЁТЕСЛИ(База!$A$1:$A$10000;A2)-1;2);"►")
Заполнение таблицы кроссировки, Определить обратные значения волокон.
 
подскажите хотя бы:
как определить количество вхождений значения в диапазон (это я сделал), а потом выдать все эти вхождения?
Заполнение таблицы кроссировки, Определить обратные значения волокон.
 
Парни, помогите заполнить Столбец "F" на листе "VDMR". Он заполняется из таблицы на листе "Исходные данные", опираясь на столбез "C" листа "VDMR"/
Для наглядности я разрисовал оптическую муфту на "Лист1". Эту схему надо перевести в табличный вид.
Вроде бы всё победил (не смейтесь над километровыми формулами - не силен в макросах).

Даже не смог сделать макрос на первом листе, что бы при изменении ячейки "C5" листа "Исх.данны" включался автофильтр в первом столбце с критерием "<=C5", а на втором листе (VDMR) фильтр при активации листа по столбцу "I" с критерием "=1".

Вернемся к столбцу F, который надо заполнить автоматически (сейчас я внес данные для понимания процесса)
Импорт данных из другой книги и их разбор, Как получить отфильтрованные данные с защищенного листа другой книги?
 
Юрий М,эх, не получается вычистить всё. буду надеяться, что пронесет.
В этом шаблоне реализован "полуавтоматический" вод данных из сметы.
(это не последний вариант, самый актуальный на работе с "причесанным кодом")

а что делать если второй файл никак не становится меньше 200 кБайт? Я могу его вычистить и вылизать, но тогда он совсем другим файлом.
Изменено: Олег З - 02.03.2017 23:19:23
Импорт данных из другой книги и их разбор, Как получить отфильтрованные данные с защищенного листа другой книги?
 
Юрий М,спасибо за совет, но я внизу написал, что мне не требуется развернутый/полный ответ или готовое решение моей хотелки, т.к. это уже полноценная работа за материальное вознаграждение.
мне нужна помощь только на этапе получения данных из книги "Смета".
файлы конечно я подготовлю и выложу, если появятся желающие помочь и им это потребуется.

kuklp, что так?
Импорт данных из другой книги и их разбор, Как получить отфильтрованные данные с защищенного листа другой книги?
 
Добрый день!
Уважаемые специалисты, долго сидел в читателях и пытался по кусочкам собрать требуемый мне код.
Что-то получалось, но основная идея никак.
Задача: получить данные из сметы (присылает подрядчик) и распределить затраты по заданным правилам для внесения в программу учета основных средств.
Проблемы:
1. смета имеет дурацкий формат и заполняется разными подрядчиками по разному.
2. в смете не используемые строки скрываются макросом, но иногда скрываются и нужные строки.
3. наименование затрат в смете часто отличаются от образца (разные исполнители)
4. в смете присутствуют объединенные ячейки

Однажды у меня получилось собрать код, который более-менее работал, но только один раз за сеанс, т.е. второй раз он уже не подгружал данные. ВИдимо плохо отрабатывала очистка области, куда данные вставлялись. Если эту область очищать PLEXом со всеми галочками, то код отрабатывал. Я грешу на проблему №4. Данные я парсил связкой =Индекс(Поискпоз()), т.к. ПОИСКПОЗ() позволяет искать с "*" и "?" (проблема №3).
вот этот код (сильно не смейтесь, т.к. код не мой, а "франкинштейн"):
Код
Public Choise As Integer
-----------------------------------------------------------------------------------------------------------
Function GetFilePath() As String

Dim fd As FileDialog   ' объявляем переменную
Set fd = Application.FileDialog(msoFileDialogOpen)  ' создаем диалог

With fd
.Filters.Clear    ' удаляем все стандартные фильтры диалога
.Filters.Add "Файлы Excel", "*.xls*"  ' создаем нулевой фильтр
'.Filters.Add "Все MDB ", "*.MDB"  ' создаем второй фильтр в данном случае он может быть не нужен
.FilterIndex = 0                   ' ставим маркер на 0 фильтр
.AllowMultiSelect = False  ' запрещаем мультиселект
.ButtonName = "Выбрать"    ' называем кнопку выбора как хотим
End With

   If fd.Show = -1 Then
      GetFilePath = fd.SelectedItems.Item(1) ' присваиваем функции путь и имя
   Else
      Exit Function   ' если нажата клавиша cancel (кстати тоже выдает ошибку)
  End If

Set fd = Nothing ' чистим память

End Function
---------------------------------------------------------------------------------------------------------------
Sub DoItMy()
Dim ActiveWB, NewWB As Workbook

Set ActiveWB = ActiveWorkbook.ActiveSheet
   
openxlsb = GetFilePath

Application.ScreenUpdating = False
    ActiveWB.Cells.ClearContents  ' очищаем лист  в текущей книге
Choise = 1
Set NewWB = Workbooks.Open(openxlsb, ReadOnly:=True)  ' открываем новую книгу
    UserForm1.Show ' форма выдает список листов в книге с выбором
    Sheets(Choise).Select                 ' выбираем лист
    'Cells.Select                ' выделяем диапазон
    'Range("A7:N395").Select     ' выделяем диапазон
    ActiveSheet.Unprotect Password:="1212"            'снимаем защиту листа
    
    Range("A7:N395").Select     ' выделяем диапазон
    Selection.EntireRow.Hidden = False
    Selection.Rows.AutoFit
 
     Dim i As Long
    For i = 28 To 376
        If Cells(i, 6).Value = 0 Or Cells(i, 6).Value = Empty _
        Then
            Rows(i).Hidden = True
        Else
            Rows(i).Hidden = False
        End If
    Next i
    Selection.SpecialCells(xlCellTypeVisible).Select    'выделяем только видимые ячейки
    'Selection.UnMerge - закоментил т.к. выдает ошибку
    Selection.Copy Destination:=ActiveWB.Range("A1")     ' копируем диапазон в нашу книгу
  NewWB.Close False                                'закрываем новую книгу без сохранения
Application.ScreenUpdating = True
End Sub
простите за простыню.

По ходу пьесы я немного изменил для себя задачу и реализовал полуавтоматическую работу (до лучших времен, т.к. мозгов реализовать начальные планы не хватает).
Пользователю предлагается:
1. на первом этапе отметить наличие в смете определенных видов работ в укрупненном виде (например: отметить "фундамент" чекбоксом, если в смете присутствуют работы и материалы связанные с фундаментными работами ФБС, отсыпка, рытьё и т.п.)
2. далее из общего списка всех возможных позиций формируется список "статей затрат" на основе этапа 1 формулами и фильтрами
3. на 3-м этапе (самый сложный для пользователя и для меня) пользователю предлагается заполнить суммы в отфильтрованном списке статей затрат.

Вот этот третий этап я и хочу автоматизировать. Для этого мне надо (тут два варианта):
1-й вариант.
- с листа "Затраты" нажав кнопку "Смета" указать файл сметы и лист в ней и присвоить переменной "FullPath" (либо разбить на 3 "Путь", "Файл", "Лист"), как вариант открыть её и указать дипазон с данными на листе - переменная "Смета".
- написать пользовательскую ф-цию, которая могла заменить связку ИНДЕКС+ПОСИКПОЗ. эта ф-ция (назовем её "ИнПо") берет текст (первый аргумент) для поиска из столбца А на листе "Затраты" (который я заполню "ключами" для поиска, используя "*" и "?" и смогу корректировать не лезя в код) и ищет соответствие в столбце В (второй аргумент) в диапазоне "Смета", возвращает данные из столбца С (третий аргумент).

2-й вариант (продолжение темы с загрузкой данных в книгу с листом "Затраты"):
- также с листа "Затраты" кнопкой "Смета" указываем путь, лист (возможно диапазон, что бы не искать его кодированием)
- проделываем над этим диапазоном ряд действий (см. код): снимаем защиту, отображаем скрытые ячейки, отменяем объединение, устанавливаем всем строкам нормальную высоту (некоторые подрядчики так скрываю ячейки), преобразовываем всё в значения (бывают ссылки на другие листы и т.д.), скрываем/удаляем строки по условию (нет затрат в столбце с работами И в столбце с материалами), выбираем оставшееся и копируем
- создаем в рабочей книге новый лист и вставляем в него данные (закрываем книгу со сметой БЕЗ изменений)
- далее работа пользовательской ф-ции (описал в первом варианте)
- после проверки пользователем (а может и програмно) если сумма в смете совпадает с суммой всех "статей затрат", то лист с данными можно смело удалять, а если не совпадает, то предложить пользователю самостоятельно найти ошибку и исправить её руками, после чего лист тоже можно удалять.

Мне кажется, что я обнаглел с таким вопросом лезть на форум, но сил и знаний не хватает для реализации хотелки. Честное слово: я очень старался несколько месяцев. Старался подробнее расписать ТЗ, т.к. сам терпеть не могу "сделай мне кнопку, что бы красиво".
В паблик образцы файлов боюсь выкладывать, хотя можно их подчистить и кинуть хотябы в личку тому, кто возьмется мне помочь.

Кстати: я не прошу выдать мне готовое решение. Мне необходим толчок в
нужном направлении (я не могу получить данные из другой книги, а
разобрать я их смогу и сам хотябы формулами) и совет: какой вариант будет оптимальнее 1-й или 2-й.
А то решите, что я тут на халяву надеюсь.
Изменено: zOn - 30.03.2016 23:16:32
Ссылка на ячейку в другой книге, формулой
 
Цитата
The_Prist написал:
   If IsArray(vData) Then        Get_Value_From_Close_Book = vData    Else        Get_Value_From_Close_Book = vData    End If
может ошибка возникает из-за того, что и Then и Else выполняют одно и тоже?
Страницы: 1
Наверх