将单元格中的单位和值转换为标准单位

将单元格中的单位和值转换为标准单位

我必须为科学报告解释数据。我们报告的数据都使用相同的单位。但是,实验室发送的数据使用不同的单位。例如,实验室可能以 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

它实际上非常智能,您可以选择任何内容,整行、整列、单个单元格,甚至不连续的范围,它都会找到并规范化所有适当的值/单位。

笔记:

  • 值前面带有< 或者 >正确规范化
  • 如果值为空或者不是数字,则值和单位均保持不变

相关内容