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


0

我必须解释科学报告的数据。我们以相同的单位报告所有数据。但是,实验室以不同的单位发送数据。例如,实验室可能会以ug(微克)发送结果,我们需要将其转换为mg(毫克)。因此,我想知道如何制作一个可以应用于列或行的宏来转换结果(即将结果数除以1000)。

我遇到的问题是数据通常是混合的,同一列中的不同单位。因此,宏只需要应用于具有不正确单位的结果(即,只有已经在ug中的结果需要转换为mg)。

由于我的数据通常包含数千行,因此它确实需要是一个宏,以便我可以突出显示一行并运行宏。然后,它将用修改后的数字替换“报告结果”单元格的内容,并使用更正后的单位更新“结果单位”单元格。

我收到的数据示例如下:

Example of Lab Data Received

如果有人有任何想法,我会非常感激。


我可以建议你将宏将Microgram中的所有值转换为Miligram,除了值为<标志。但我可以建议你为这些值(< 1)的公式从ug转换为mg,只是确认它对你有用吗?
Rajesh S

Answers:


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

它实际上非常聪明,您可以选择任何内容,整行,整列,单个单元格,甚至是不连续的范围,它将查找并标准化所有适当的值/单位。

笔记:

  • 值以a开头 < 要么 > 正确归一化
  • 如果值为空或不是数字,则它和单位保持不变
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.