Определяемая пользователем функция VBA для отображения 1/8 дюйма отображается пустым

#excel #vba #format #rounding #user-defined-functions

#excel #vba #формат #округление #определяемые пользователем функции

Вопрос:

Я очень новичок в VBA. Я написал этот UDF (мой первый правильный фрагмент кодирования), и я что-то напортачил, но я не знаю, что. Я знаю очень мало и в настоящее время прохожу курс, но большинство ответов кажутся взаимозаменяемыми для моих необразованных глаз.

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

 Function NearestEighth(number) As String
Dim NE As String

WholeNum = Application.WorksheetFunction.RoundDown(number, 0)
DecNum = (number) - (WholeNum)

    Near = Round(DecNum * 8, 0) / 8

Select Case Near

Case Is = 0
NE = ""

Case Is = 0.125
NE = "1/8"

Case Is = 0.25
NE = "1/4"

Case Is = 0.375
NE = "3/8"

Case Is = 0.5
NE = "1/2"

Case Is = 0.625
NE = "5/8"

Case Is = 0.75
NE = "3/4"

Case Is = 0.875
NE = "7/8"

End Select

Prelim = (number)

Select Case Prelim
    
    Case Prelim > 0 And Prelim < 1
    FractionFormat = NE
    
    Case Prelim > 1
    FractionFormat = (WholeNum) amp; "-" amp; (NE)
    
End Select

NearestEighth = FractionFormat

End Function
  

Комментарии:

1. Обратите внимание, что Round используется округление банкира, которое вы, вероятно, захотите использовать WorksheetFunction.Round .

2. почему бы просто не использовать формат # ?/8 ? Если вы хотите, чтобы текст был выводом: = TEXT(A1,"# ?/8") нет необходимости в vba.

3. Это не для моего использования. Я сделал это в Excel, но я хотел бы иметь возможность просто вызвать функцию. Кроме того, это кажется достаточно простой задачей и хорошей практикой для такого новичка, как я.

4. Если вам нужен UDF: NearestEighth = Format(number,"#-?/?")

5. @ScottCraner Я пробовал это. Это дало мне несколько выходных данных weid. 0,3 дает -? /?, 0,7 получил 1-? /?. Я думаю, что это просто не соответствует действительности. Я попытался добавить вычисление отдельно, но получил аналогичные результаты. Function Craner2(number) Dim Near As Double Near = Round(number * 8, 0) / 8 Craner2 = Format(number, "#-?/?") End Function

Ответ №1:

Рассмотрим:

 Public Function NearestEighth(number As Double) As String
    Dim wf As WorksheetFunction, n8 As Double
    Set wf = Application.WorksheetFunction
    
    n8 = wf.Round(number * 8, 0) / 8
    
    NearestEighth = wf.Text(n8, "# -?/8")
End Function
  

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

Ответ №2:

Select..Case может использоваться только для отдельных случаев, а не для непрерывного диапазона.

Используйте If вместо этого для замены Select Case Prelim.. End Select :

 If Prelim > 0 And Prelim < 1 Then
    FractionFormat = NE
ElseIf Prelim > 1 Then 
    FractionFormat = (WholeNum) amp; "-" amp; (NE)
End If
  

Ответ №3:

Запись всего набора данных с использованием диапазона разлива (MS365)

Используя MS 365, вы даже можете вызвать процедуру для записи значений сразу, используя так называемый диапазон утечки (например "B1#" ) для ссылки на динамическую цель:

 Option Explicit

Sub ShowNearestEighths()
With Sheet1                  ' referencing the project's worksheet by Code(Name)
    Dim lastRow As Long
    lastRow = .Range("A" amp; .Rows.Count).End(xlUp).Row
    'calculate nearest eighths
    .Range("B1").Formula2 = "=Round(A1:A" amp; lastRow amp; " * 8, 0) / 8"
    'use spill range to format
    .Range("B1#").NumberFormat = "# -?/8"
End With
End Sub