2017-10-10 46 views
3

1桁が含まれていますが、書式が正しくないため、テキストとして扱われます。VBA - 文字列内の文字を置き換えます。

enter image description here

そのため、何もして、ドットのためのコンマのためのドットを交換する必要があります。私はコードを持っています:

しかし、それは何もしません。エラーはありません。ただロードしてから何も起こりません。私が間違っていたことや、何がうまくいくのか、アドバイスできますか?

多くの感謝!

+0

これらのサブセットはいつ呼び出されますか?列のデータ型を必要な形式に変更するのは簡単ではありませんか? – Quirinux

+0

コードが正しく表示されますが、Worksheets( "Sheet1")などのワークシートを明示的に宣言する価値があります... – Leroy

答えて

0

として保存されたデータを残して、ドットは次のように使用されている - それは、彼らがどうあるべきかに戻ってセパレータ小数(千)をリセットする前に番号の範囲を変換するためにtext to columnsを使用しています小数点区切り記号とカンマが1000個の区切り記号として使用されます。それを言って、次のコードは私のために働き、期待される出力を生成します。

コードをテストするには、ウェブページの数字をコピーしてシートに貼り付けました。下のようになります...

enter image description here

コード:

Sub Test() 
With Range("P:P") 
    .Replace ".", "" 
    .Replace ",", "." 
    .NumberFormat = "0.00" 
End With 
End Sub 

出力:

enter image description here

0

これはそれを行うための方法です:

Public Sub TestMe() 

    Debug.Print generateNumber("1.525,32") 
    'works with mixed formats: 
    Debug.Print generateNumber("12,525.33") 
    Debug.Print generateNumber("1,112.525,35") 

End Sub 

Public Function generateNumber(strInput As String) As Double 

    strInput = Replace(Replace(strInput, ".", ""), ",", "") 

    generateNumber = CDbl(Left(strInput, Len(strInput) - 2)) 

    'getting the first digit after the comma 
    generateNumber = generateNumber + 0.1 * CLng(Mid(strInput, Len(strInput) - 1, 1)) 

    'getting the second digit after the comma 
    generateNumber = generateNumber + 0.01 * CLng(Mid(strInput, Len(strInput), 1)) 

End Function 

入力が標準である場合には、整数の後に2桁の数字で、それが標準出力を返します。

異なる国では区切り記号が異なるため、小さなプラスの書​​式設定があります。

0

あなたのコードはうまく動作します。あなたのケースでうまくいかない場合は、その列がテキストとして書式設定されていると思います。書式を数値または標準に変更するだけです。

これを試してみてください。

Private Sub Correction_of_dot() 
    Columns("P:P").Select 
    Selection.NumberFormat = "General" 

    Dim i As String 
    Dim k As String 
    i = "." 
    k = "" 
    Columns("P:P").Replace what:=i, replacement:=k, lookat:=xlPart, MatchCase:=False 

    i = "," 
    k = "." 
    Columns("P:P").Replace what:=i, replacement:=k, lookat:=xlPart, MatchCase:=False 
End Sub 
0

マクロ介入がテキスト値で列を選択することである必要はありません簡単な解決策、後藤Dataタブ==>Text to Columns ==>次==>次==>Generalを選択列データ形式。

enter image description here

enter image description here

enter image description here

カンマ(高度なオプションの下)、10進数または桁区切りである場合にもExcelを伝えることができます...

enter image description here

+1

小数点区切り文字が混在しているため、この場合は機能しません – Tom

+0

実際にはもしあなたが自動的に認識しない場合には、あなたは常に高度なテキスト設定を使用することができます... –

+1

私のテストでは動作しませんでしたが、あなたが今見た 'Advanced Text Import Settings'追加された – Tom

1

てみてくださいこれを使ってコードは、最初に、小数点の区切り記号が列にあるものと一致するように言語を変更します。それはExcelにそれをテキストとして保存された数字として認識させます。今の数字私の地域の設定を1として

Sub CorrectIncorrectNumberFormat() 
    With Application 
     .UseSystemSeparators = False 
     .DecimalSeparator = "," 
     .ThousandsSeparator = "." 
    End With 

    'Update to your applicable range I've set it to sheet1 Column A 
    With Sheet1 
     With Range(.Cells(1, 1), .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 1)) 
      .TextToColumns Destination:=.Cells(1), DataType:=xlDelimited, _ 
       TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _ 
       Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _ 
       :=Array(1, 1), TrailingMinusNumbers:=True 
     End With 
    End With 

    With Application 
     .DecimalSeparator = "." 
     .ThousandsSeparator = "," 
     .UseSystemSeparators = True 
    End With 
End Sub 
0

あなたは可能性があり、列をループと置換機能を使用しています。

Dim i As Long 
Dim finalRow As Long 

finalRow = SheetX.Cells(Rows.Count, 1).End(xlUp).Row 

For i = 1 to finalRow 

    SheetX.Cells(i, 1).Value = Replace(SheetX.Cells(i, 1).Value, ".", "") 
    SheetX.Cells(i, 1).Value = Replace(SheetX.Cells(i, 1).Value, ",", ".") 

Next i 

注:これはテストしませんでしたが、動作するはずです。 また、CodeXが適切なシートにSheetXを変更し、必要に応じて列参照を変更します(この例では列1)。

関連する問題