Excel VBA - конвертировать числа перед определенной подстрокой - PullRequest
0 голосов
/ 23 января 2019

У меня есть столбец с ячейками, заполненными содержимым HTML, которое включает измерения в сантиметрах, которые нам нужно преобразовать в дюймы.

Число для преобразования всегда предшествует "см", как в <p><strong>Medium - 6.3cm x 7cm</strong></p>

Я пытался скопировать содержимое всей ячейки в соседнюю ячейку и определить числа для преобразования, посмотрев между «см» и пробелом.

Однако между пробелами не всегда есть пробел.число и другой символ, как могут быть случаи, как <p>8cm x 5.3cm</p> или blah-10.5cm x 5cm.В некоторых случаях это происходит в начале ячейки, и в этом случае также не должно быть пробела, например 12cm x 8cm - blah blah blah.

Может кто-нибудь предложить какой-либо способ сделать это, указав число для преобразования как все нечисловые символы, предшествующие подстроке "cm"?

Что мы до сих пор пытаемся обойти, заменив символы, которые отображаются перед цифрами, пробелом ... но обнаружив, что слишком много возможностей необходимо длязамена и это также портит HTML.

Я скопировал его ниже для справки в любом случае.Если бы кто-нибудь мог помочь нам решить эту проблему, он был бы очень признателен!

Sub ChangeCM2IN()
  Dim X As Long, V As Double, Cell As Range, CM() As String
  Application.ScreenUpdating = False
  For Each Cell In Range("A1", Cells(Rows.Count, "A").End(xlUp))
    CM = Split(Replace(Replace(" " & Cell.Value, "x", "x ", , , vbTextCompare), ">", " "), "cm", , vbTextCompare)
    For X = 0 To UBound(CM) - 1
      V = Format(Mid(CM(X), InStrRev(CM(X), " ")) * 0.393700787401575, "0.0")
      CM(X) = Left(CM(X), InStrRev(CM(X), " ")) & V
    Next
    Cell.Offset(, 1).Value = Join(CM, "in")
  Next
  Application.ScreenUpdating = True
End Sub

1 Ответ

0 голосов
/ 23 января 2019

Есть кто-то, кто поможет с этим, и они придумали это действительно хорошее решение. Надеюсь, может быть когда-нибудь кому-нибудь пригодится!

Sub ChangeCM2IN()
  Dim X As Long, Z As Long, FirstDigit As Long, V As Double, Cell As Range, CM() As String
  Application.ScreenUpdating = False
  For Each Cell In Range("A1", Cells(Rows.Count, "A").End(xlUp))
    CM = Split(" " & Cell.Value, "cm", , vbTextCompare)
    For X = 0 To UBound(CM) - 1
      For Z = Len(CM(X)) To 1 Step -1
        If Mid(CM(X), Z, 1) Like "[!0-9.]" Then
          FirstDigit = Z + 1
          V = Format(Mid(CM(X), FirstDigit) * 0.393700787401575, "0.0")
          Exit For
        End If
      Next
      CM(X) = Left(CM(X), FirstDigit - 1) & V
    Next
    Cell.Offset(, 1).Value = Trim(Join(CM, "in"))
  Next
  Application.ScreenUpdating = True
End Sub
...