web-dev-qa-db-ja.com

VBA:テキストを数値に変換

なんらかの理由でテキストとしてフォーマットされた数字の列があります。これにより、小計関数などの算術関数を使用できなくなります。これらの「テキスト番号」を真の番号に変換する最良の方法は何ですか?

特定の問題のスクリーンショットを次に示します。 Error

私はこれらのスニペットを試してみました:

Columns(5).NumberFormat = "0"

そして

 Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
15
aLearningLady

以下の関数を使用して([E:E]を必要に応じて適切な範囲に変更)、この問題を回避します(または「mm/dd/yyyy」などの他の形式に変更します)。

[E:E].Select
With Selection
    .NumberFormat = "General"
    .Value = .Value
End With

追伸私の経験では、このVBAソリューションは大きなデータセットで非常に高速に動作し、「警告ボックス」メソッドを使用するよりもExcelをクラッシュさせる可能性は低くなります。

25
aLearningLady

これを使用して、シート内のすべての数値(テキストとしてフォーマットされたものも含む)を検索し、それらを単一に変換できます(CSng関数)。

For Each r In Sheets("Sheet1").UsedRange.SpecialCells(xlCellTypeConstants)
    If IsNumeric(r) Then
       r.Value = CSng(r.Value)
       r.NumberFormat = "0.00"
    End If
Next
6
Jones

私は以前この問題を抱えていましたが、これが私の解決策でした。

With Worksheets("Sheet1").Columns(5)
    .NumberFormat = "0"
    .Value = .Value
End With
5
BerticusMaximus

これにより、Excelワークブックの列のすべてのテキストが数値に変換されます。

Sub ConvertTextToNumbers()
Dim wBook As Workbook
Dim LastRow As Long, LastCol As Long
Dim Rangetemp As Range

'Enter here the path of your workbook
Set wBook = Workbooks.Open("yourWorkbook")
LastRow = Cells.Find(What:="*", After:=Range("A1"), SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
LastCol = Cells.Find(What:="*", After:=Range("A1"), SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column

For c = 1 To LastCol
Set Rangetemp = Cells(c).EntireColumn
Rangetemp.TextToColumns DataType:=xlDelimited, _
    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
    Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
    :=Array(1, 1), TrailingMinusNumbers:=True
Next c
End Sub
3
ConertVBA

私のために働く解決策は次のとおりです。

For Each xCell In Selection

  xCell.Value = CDec(xCell.Value)

Next xCell 
1
Camilo Vargas

上記のaLearningLadyの回答を使用すると、列全体を選択するだけでなく、データが含まれる最後の行を検索することで、選択範囲を動的にすることができます。

以下のコードは私のために働いた。

Dim lastrow as Integer

lastrow = Cells(Rows.Count, 2).End(xlUp).Row

Range("C2:C" & lastrow).Select
With Selection
    .NumberFormat = "General"
    .Value = .Value
End With
0
Mikey

大規模なデータセットの場合、より高速なソリューションが必要です。

「テキストから列へ」機能を使用すると、高速なソリューションが提供されます。

25からLastRowの範囲を開始する列Fに基づく例

Sub ConvTxt2Nr()

Dim SelectR As Range
Dim sht As Worksheet
Dim LastRow As Long

Set sht = ThisWorkbook.Sheets("DumpDB")

LastRow = sht.Cells(sht.Rows.Count, "F").End(xlUp).Row

Set SelectR = ThisWorkbook.Sheets("DumpDB").Range("F25:F" & LastRow)

SelectR.TextToColumns Destination:=Range("F25"), DataType:=xlDelimited, _
    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
    Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
    :=Array(1, 1), TrailingMinusNumbers:=True

End Sub
0
Louis