#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