我必须为科学报告解释数据。我们报告的数据都使用相同的单位。但是,实验室发送的数据使用不同的单位。例如,实验室可能以 ug(微克)发送结果,而我们需要将其转换为 mg(毫克)。因此,我想知道如何制作一个宏,您可以将其应用于列或行来转换结果(即,将结果数字除以 1000)。
我遇到的问题是数据通常会混淆,同一列中的单位不同。因此,只需将宏应用于单位不正确的结果(即,只需将已经以 ug 为单位的结果转换为 mg)。
由于我的数据通常包含数千行,因此它确实需要一个宏,以便我可以突出显示一行并运行该宏。然后它会用修订后的数字替换“报告结果”单元格的内容,并用更正后的单位更新“结果单位”单元格。
我收到的数据示例如下:
如果有人有任何想法我将不胜感激。
答案1
这是一个相当简单但强大且智能的宏,可以将微克标准化为毫克:
'============================================================================================
' Module : <any standard module>
' Version : 0.1.0
' Part : 1 of 1
' References : N/A
' Source : https://superuser.com/a/1333314/763880
'============================================================================================
Option Explicit
Public Sub NormaliseUnits()
Dim ¡ As Long
Dim rngTarget As Range
For Each rngTarget In Selection.Areas
'Minimise the number of cells to be processed
Set rngTarget = Intersect(rngTarget, rngTarget.Parent.UsedRange)
If rngTarget Is Nothing Then Exit For 'Nothing to do as the mimimised Area doesn't contain any data
' Expand the minimised target to include the previous column:
If rngTarget.Column > 1 Then
Set rngTarget = rngTarget.Offset(ColumnOffset:=-1).Resize(ColumnSize:=rngTarget.Columns.Count + 1)
End If
' Expand the minimised target to include the next column:
If rngTarget.Column + rngTarget.Columns.Count - 1 < Columns.Count Then
Set rngTarget = rngTarget.Resize(ColumnSize:=rngTarget.Columns.Count + 1)
End If
' Loop through all cells (skipping the first column) looking for a "ug" to fix
Dim rngRow As Range
For Each rngRow In rngTarget.Rows
For ¡ = 2 To rngRow.Columns.Count
If rngRow.Cells(¡) = "ug" _
And rngRow.Cells(¡ - 1) <> vbNullString _
Then
Dim strValue As String: strValue = CStr(rngRow.Cells(¡ - 1).Value2)
Dim strLessThan As String: strLessThan = vbNullString
If InStr("<>", Left$(strValue, 1)) Then
strLessThan = Left$(strValue, 1)
strValue = Mid$(strValue, 2)
End If
If IsNumeric(strValue) Then
rngRow.Cells(¡ - 1).Value2 = strLessThan & CStr(CDbl(strValue) / 1000)
rngRow.Cells(¡) = "mg"
End If
End If
Next ¡
Next rngRow
Next rngTarget
End Sub
它实际上非常智能,您可以选择任何内容,整行、整列、单个单元格,甚至不连续的范围,它都会找到并规范化所有适当的值/单位。
笔记:
- 值前面带有
<
或者>
正确规范化 - 如果值为空或者不是数字,则值和单位均保持不变