Новости:

Форум на данный момент в стадии обновления. Если у Вас возникли проблемы со входом в свою учетную запись - просьба писать на email: info@excel-vba.ru

Главное меню

Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.

Просмотр сообщений

Сообщения - Mike_B

#1
На всякий случай код со ссылки, раз она не отобразилась. Вдруг кто-то имеет Мак, сможет вставить и проверить.

'======================================================================================================================
Public Function GetFileName(dlgTitle As String) As String
    Dim result As String

    result = ""

    #If Mac Then
        result = GetFileName_Mac()
    #Else
        result = GetFileName_Windows(dlgTitle)
    #End If

    GetFileName = result
End Function
'======================================================================================================================
Public Function GetFileName_Windows(dlgTitle As String) As String
    Dim result As String
    Dim fd As Office.FileDialog
    Set fd = Application.FileDialog(msoFileDialogFilePicker)

    With fd
        .Filters.Clear
        .Filters.Add "CSV Files (*.csv)", "*.csv", 1
        .Filters.Add "All Files (*.*)", "*.*", 2
        .title = dlgTitle
        .AllowMultiSelect = False
     
        If .Show = True Then
            result = .SelectedItems(1)
        End If
    End With

    GetFileName_Windows = result
End Function
'======================================================================================================================
' Adapted from https://stackoverflow.com/questions/12263016/is-there-a-mac-pc-variant-of-application-getopenfilename
Function GetFileName_Mac() As String
    Dim startPath As String
    Dim script As String
    Dim result As String
    Dim MySplit As Variant
    Dim N As Long
    Dim FName As String
    Dim mybook As Workbook

    On Error Resume Next
    startPath = MacScript("return (path to documents folder) as String")
   
    ' Or use startPath = "Macintosh HD:Users:Ron:Desktop:TestFolder:"

    ' In the following statement, change true to false in the line "multiple
    ' selections allowed true" if you do not want to be able to select more
    ' than one file. Additionally, if you want to filter for multiple files, change
    ' {""com.microsoft.Excel.xls""} to
    ' {""com.microsoft.excel.xls"",""public.comma-separated-values-text""}
    ' if you want to filter on xls and csv files, for example.
    script = _
    "set applescript's text item delimiters to "","" " & vbNewLine & _
               "set theFiles to (choose file of type " & _
             " {""public.comma-separated-values-text""} " & _
               "with prompt ""Please select a file or files"" default location alias """ & _
               startPath & """ multiple selections allowed false) as string" & vbNewLine & _
               "set applescript's text item delimiters to """" " & vbNewLine & _
               "return theFiles"

    result = MacScript(script)
    result = Replace$(result, "Macintosh HD", "", Count:=1)
    result = Replace$(result, ":", "/")
    GetFileName_Mac = result
End Function
#2
Цитата: Дмитрий Щербаков(The_Prist) от 20.08.2021, 15:50:47
А разве столь нужны остальные файлы, чтобы посмотреть код? :)
Это чтобы можно было прогнать. :)
Цитировать.Cells(6, "B") = ThisWorkbook.Path & Application.PathSeparator &  "MiraGoGt.xlsx"
Это меньшая из проблем. ))
Цитировать2. Насколько знаю, диалоговые окна выбора файлов и папок на МАС и Windows различаются. Поэтому надо будет искать код диалогового окна под MAC и делать ветвление в зависимости от типа операционной системы. Что-то вроде:
Именно об этом речь в вопросе. Нашел разные вещи, почти все на applescript, но я его не знаю, чтобы проверить, да и не на чем.

ЦитироватьНо там надо более капитально в тему погружаться, т.к. разные версии Excel и MAC могут требовать различные методы. Но это не точно :)
И вот про это тоже говорилось на разных ресурсах.

И попутно, Дмитрий, спасибо Вам большое за сайт и этот форум, много полезного находил. Ваша работа помогает людям.
#3
Второе вложение
#4
Добрый день всем!
Нет ли тут спецов по экселю для мака? Написан макрос, отлично работает. Суть его в сборе данных из 4 файлов и формировании общей статистики.
Но стало нужно адаптировать его для работы в MS Office на маке. Как я понимаю, нужно заменить операторы открытия (и, возможно, сохранения) файлов. Но мака у меня нет и опыта работы в нем тоже.
Нашел вот такое: http://www.jasinskionline.com/... ialog.ashx
Вопрос: это сработает? Не может ли кто-то помочь заменить и проверить работу?
В одно вложение не влезло, разбил на 2.
#5
Цитата: Дмитрий Щербаков(The_Prist) от 26.02.2021, 14:47:07
это где так жестко приходится извращаться, чтобы формат системной даты менять?
Модуль календаря, найденный в инете. Авторства, увы, не знаю. Там по двойному клику выбирается дата и выполняется оператор TB = CStr(DateValue(dt_1)) И если дата не вида 26.02.2021, а Пт 26.02.2021 - имеем брык от DateValue.
Сам календарь, если надо, выложу.
ЦитироватьСмотря на чем этот 64-ый работает. Если офис ниже 2010 - то надо дополнительные блоки для этого писать(именно как на примере у Вас ниже).
Вот как тогда будут выглядеть описания? String сохраняется, Long меняем на LongLong? Но вот hwnd то Long, то LongPtr. И возврат у SetLocaleInfo то Boolean, то Long.
Вообще синее нагуглено в инете, красное - взято из Win32API_PtrSafe.TXT издания 2010 года.
Цитироватьэто вроде Variant в VBA - означает любой.
Variant знаю, Any - первый раз встретил.
#6
Добрый день.
Хитрые юзеры меняют формат даты (например, на полный в духе Пт 26.02.2021), а у меня рассчитано на ДД.ММ.ГГГГ. Даже не у меня, а календаря.
Сделал смену формата даты и возврат после. На 7-64 с офисом 32 бит работает. Декларации ниже.
Но вот вопрос - как будет на 64 ? Именно эти декларации менять надо или нет? Как понять и какими будут?
Что за тип lParam As Any у PostMessage?

#If VBA7 Then
   Public Declare PtrSafe Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long
   Public Declare PtrSafe Function SetLocaleInfo Lib "kernel32" Alias "SetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String) As Long
   Public Declare PtrSafe Function GetSystemDefaultLCID Lib "kernel32" Alias "GetSystemDefaultLCID" () As Long
   Public Declare PtrSafe Function GetUserDefaultLCID Lib "kernel32" Alias "GetUserDefaultLCID" () As Long
   Public Declare PtrSafe Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As Long
#Else
   Public Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long
   Public Declare Function SetLocaleInfo Lib "kernel32" Alias "SetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String) As Boolean
   Public Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long
   Public Declare Function GetUserDefaultLCID Lib "kernel32" () As Long
   Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
#End If


Почему вопрос - недавно такое видел:

#If Win64 Then
    #If VBA7 Then    ' Windows x64, Office 2010
        Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _
                (ByVal pCaller As LongLong, ByVal szURL As String, ByVal szFileName As String, _
                 ByVal dwReserved As LongLong, ByVal lpfnCB As LongLong) As LongLong
    #Else            ' Windows x64,Office 2003-2007
        Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _
                                           (ByVal pCaller As LongLong, ByVal szURL As String, ByVal szFileName As String, _
                                            ByVal dwReserved As LongLong, ByVal lpfnCB As LongLong) As LongLong
    #End If
#Else
    #If VBA7 Then    ' Windows x86, Office 2010
        Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _
                (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, _
                 ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
    #Else            ' Windows x86, Office 2003-2007
        Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _
                                           (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, _
                                            ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
    #End If
#End If
#7
Цитата: vikttur от 20.02.2021, 12:18:28
Это - что? Название темы должно отражать задачу.
Предложите название, заменим.
Это - имелось в виду данные из таблиц. Возможно ли каждому набору подобрать формулу, зависящую от 2 параметров, которая бы совпадала в заданных точках или была к ним наиболее близка или такое никак?
#8
Здравствуйте!
Подкинули такой вопрос - можно ли это задать какой-то функцией?
Есть 3 таблицы. В каждой по вертикали идет высота, по горизонтали - ширина, на пересечении - цена.
В каждой таблице хотят иметь возможность вычислить цену для промежуточных значений, например, при 150 на 150.
Можно построить (на диаграммах) ряд и аппроксимацию. Сделал для ширины и первой строки (высота 100) для каждой из таблиц. То есть таким образом можно получить уравнения для всех 6 строк.
Но вопрос: как использовать уравнение для промежуточных значений по высоте? Можно ли описать всю таблицу одним уравнением? Возможно, это будут сплайны? Однако ж давно я институт закончил и сходу не соображу, как это все проделать. Может быть, кто-то подскажет? В идеале файл, куда вписать значения таблицы и получить формулу.
#9
Уважаемый Дмитрий!
Знаю Вас по инету, как очень сведущего человека. Многими подсказками из Ваших сообщений на разных форумах пользовался и "мотал на ус". Спасибо!

Здесь сложность была в том, что в документации приведены примеры запросов, подходящие под php (как я понимаю), и преобразовать их в VBA - неясно, как.
Кроме того, не зря я подозревал, что есть разница в разных объектах. WinHttp.WinHttpRequest.5.1 делал перекордировку UTF -> 1252 и получалась каша.
После подсказки об этом получилось вот что (работает). Остается разбор JSON, это уже следующий этап (после кучи попыток вчера замотался и ошибочно написал, что XML).


Sub SendOzon()
  Const MULTIPART_BOUNDARY As String = "---------------------------0123456789012"
  Dim xhr As Object, myUrl As String, sURL As String, sMethod As String, sData As String, sHeaders As String
  Dim clientId As String, apiKey As String, ff As Integer

  Set xhr = CreateObject("Microsoft.XMLHTTP")
  If xhr Is Nothing Then Set xhr = CreateObject("MSXML2.ServerXMLHTTP")

  ' По https://cb-api.ozonru.me/apiref/ru/#t-title_products_info
  sURL = "https://cb-api.ozonru.me"      ' URL отладки
  sMethod = "/v1/category/attribute"
  sData = "{""category_id"": 17036076, ""language"": ""EN""}"
  clientId = "836"                    ' ID клиента (отладка)
  apiKey = "0296d4f2-70a1-4c09-b507-904fd05567b9" ' ключ (отладка)

  myUrl = sURL & sMethod

  xhr.Open "POST", myUrl, False
  xhr.setRequestHeader "User-Agent", "Mozilla 5.0"
  xhr.setRequestHeader "Content-Type", "application/json; charset=windows-1251"
  xhr.setRequestHeader "Content-Length", Len(sData)
  xhr.setRequestHeader "Client-Id", clientId
  xhr.setRequestHeader "Api-Key", apiKey
  xhr.send "" + sData  'postBody 'URLEncode(sEntityBody)

  Range("A2").Value = xhr.responseText   ' что получили
  Range("A3").Value = sData              ' что слали

  Set xhr = Nothing
End Sub

#10
Добрый день всем!
Наверняка тема обсуждалась, поискал, не нашел. Ткните куда-то или подскажите.
У Озона есть API, описано на cb-api.ozonru.me/apiref/ru/
Искал и пробовал адаптировать примеры, но что-то не догоняю.
Например, авторизация в тестовую среду в документации описана так:

GET / HTTP/1.1
Host: cb-api.ozonru.me
Client-Id: 836
Api-Key: 0296d4f2-70a1-4c09-b507-904fd05567b9
Content-Type: application/json


Как это сделать из экселя?
Или вот запрос информации о товаре:

POST /v2/product/info HTTP/1.1
Host: api-seller.ozon.ru
Client-Id: 836
Api-Key: 0296d4f2-70a1-4c09-b507-904fd05567b9
Content-Type: application/json

{
  "offer_id": "item_6060091",
  "product_id": 7154396,
  "sku": 150583609
}


Как послать запрос? В ответ будет XML, чем его удобнее разбирать, кстати?
Что лучше использовать: WinHttpRequest, MSXML2.XMLHTTP60, MSXML2.ServerXMLHTTP ? Везде разное.
Понимаю, для здешних гуру это плевый вопрос, но вот пока лишь простой GET с параметрами в адресе использовал, и только.
Спасибо.
Яндекс.Метрика Рейтинг@Mail.ru