Nano Hash - криптовалюты, майнинг, программирование

Как я могу принудительно использовать NumberFormat для функции VBA в результате функции VBA?

Пытаюсь преобразовать метки времени, указанные в секундах после первого января 1970 года. Я написал небольшую функцию в Excel VBA для преобразования в формат даты Excel. Это прекрасно работает в том смысле, что оно преобразуется в число, которое при правильном форматировании дает метку времени в понятной форме, но мне приходится каждый раз форматировать вызовы вручную. Я пытался решить эту проблему несколькими способами, но либо это ничего не делает с числом, либо приводит к ошибке: "#VALUE." Функция называется Sec2TS, и если я использую: 1502569847 в качестве входных данных, она возвращает: 42959.8547106481, что является правильно, но хотелось бы видеть: 2017 Aug 12 20:30:47. Я добавил код:

   Function Sec2TS(Secs As Double) As Date

If Secs > 0 Then
    Sec2TS = 25569 + (Secs / 86400)
Else
    Sec2TS = 0
End If

ActiveCell.NumberFormat = "yyyy mmm dd hh:mm:ss"

End Function

Что с этим не так? Я пытался установить диапазон для выбора и переключения приложений, но безрезультатно.

09.03.2020

  • Если вы используете это как UDF, вы не можете. Пользовательские функции не могут (за исключением некоторых пограничных случаев) изменять лист. 09.03.2020
  • Либо предварительно отформатируйте ячейки в свой NumberFormat, либо вместо этого верните дату в виде строки, но имейте в виду, что дата в строковой форме может быть не идеальной для ваших обстоятельств. 09.03.2020
  • Обходной путь может состоять в том, чтобы использовать событие Worksheet.Change для переформатирования ячейки после того, как вы ввели свой UDF. 09.03.2020

Ответы:


1

Если бы формула могла изменить форматирование на листе, это привело бы к совершенно сумасшедшим эффектам для всех пользователей, потому что они не знали бы, почему на самом деле происходят все эти странные вещи. Вероятно, это основная причина, по которой формула/UDF ничего не может изменить на листе, она может только возвращать значение.

В качестве обходного пути вы можете использовать событие Worksheet_Change. чтобы отформатировать ячейку сразу после ввода формулы, содержащей Sec2TS. Итак, сначала мы проверяем, какие ячейки измененного диапазона (Target) содержат формулы (Target.SpecialCells(xlCellTypeFormulas)), а затем проверяем, содержит ли какая-либо ячейка в этом диапазоне "Sec2TS" в своей формуле для .NumberFormat этих ячеек.

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim CellsWithFormulas As Range
    On Error Resume Next
    If Target.Cells.CountLarge > 1 Then
        Set CellsWithFormulas = Target.SpecialCells(xlCellTypeFormulas)
    ElseIf Target.HasFormula Then
        Set CellsWithFormulas = Target
    End If
    On Error GoTo 0

    If CellsWithFormulas Is Nothing Then Exit Sub

    Dim Cell As Range
    For Each Cell In CellsWithFormulas.Cells
        If InStr(1, Cell.Formula, "Sec2TS") > 0 Then
            Cell.NumberFormat = "yyyy mmm dd hh:mm:ss"
        End If
    Next Cell
End Sub

Обратите внимание, что проверка Target.Cells.CountLarge > 1 необходима, потому что, если вы примените SpecialCells только к одной ячейке, VBA автоматически применит ее ко всем ячейкам рабочего листа, что сделает код очень медленным.

09.03.2020

2

Если вам не нужно обрабатывать значения численно, вы можете использовать String вместо Date в качестве вывода функции:

Function Sec2TS(Secs As Double) As String
    Dim D As Double

    If Secs > 0 Then
        D = CStr(25569# + (Secs / 86400#))
    Else
        D = CStr(0)
    End If

    Sec2TS = Format(D, "yyyy mmm dd hh:mm:ss")
End Function

введите здесь описание изображения

09.03.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..