2016-08-08 16 views
0

問題があり、何が起こっているのか、その理由を理解できません。vbaで10または小数点以下を使用した場合のパーセント値への書式

私は多くのパーセンテージ値を持つuserformを持っています。

enter image description here

これらの値は、彼らは、まさにこのように見えるExcelシートから来ます。ユーザーはこれらの値を変更し、そのExcelシートに戻すことができるようになりました。ユーザーのアクティビティもログシートに保存されます。すべての値もそこに保存されます。私はこのような値を入れます:

Private Sub saveV_Click() 
    Dim wsLog As Worksheet 
    Dim i As Long 
    Dim j As Long 
    Dim lastRow As Long 
    Dim tbNr As String 
    j = 3 
    i = 2 
    Set wsLog = ThisWorkbook.Worksheets("Log") 
    With wsLog 
     lastRow = findLastRow(wsLog) 
     lastColumn = findLastColumn(wsLog) 
     For Each tb In Me.Controls 
      If TypeName(tb) = "TextBox" Then 
       Select Case i 
        'case 2 and 3 values are fixed and not of any interest 
        Case 2 
         .Cells(lastRow + 1, 1).Value = tb.Value 
        Case 3 
         .Cells(lastRow + 1, 2).Value = tb.Value 
        'the following cases refer to the textboxes you can see in the other picture (there are some more) 
        Case 4 To 46 
         .Cells(lastRow + 1, j).Value = tb.Value 
        Case 47 To 89 
         .Cells(lastRow + 2, j).Value = Format(tb.Value, "0.00%") 
        Case 90 To 132 
         .Cells(lastRow + 3, j).Value = Format(tb.Value, "0.00%") 
       End Select 
      i = i + 1 
      j = j + 1 
      If j > lastColumn Then j = 3 
      End If 
     Next 
    End With 
    Unload Me 
End Sub 

コードは正しく動作しますが、正しい値をフォーマットしません。

私が使用している場合Format(tb.Value, "0.00%")私の値は101,49316739%は、私はより多くのゼロを追加してみましたが、私はFormat(tb.Value, "0.000%")私の値取得の1000年を掛けを使用する場合それは101493%になり101,49%

になりますので、丸められてしまいます。 (さらに多くのゼロの場合はさらに)

10個以上の小数点で値を保存するにはどうすればよいですか?

答えて

2

Format関数は、値をStringに変換します。それはあなたがここにコードを意味します...

.Cells(lastRow + 2, j).Value = Format(tb.Value, "0.00%") 

は... 101,49316739Double値を取ると、「101,49%」のString値に変換します。 .Cells(lastRow + 2, j).ValueのデータタイプはVariantですが、サブタイプStringVariantを指定しています。 Excelは、あなたが書いている値が実際に数値として表現できるかどうかを判断する必要があります。ない保存値について - 忘れないでください、Format読めるバージョン番号のを表示するためのものです。

ただ、Excelが書式設定を行いましょう:

.Cells(lastRow + 2, j).Value = CDbl(tb.Value) \ 100 'Cast from string to double and scale. 
.Cells(lastRow + 2, j).NumberFormat = "0.000000000000000%" 'Format the cell. 
+0

ええと、「NumberFormat」と「Format」についてあなたの意見が本当にありがとうございました。あなたのコードは私に 'CDbl(tb.Value)'の型不一致エラーを与えています。それについてのアイデア? –

+0

これは、 'tb.Value'の値が何であれ、数値に変換できないことを意味します。 'IsNumeric(tb.Value)'のような検証コードを追加したいと思うでしょう。 – Comintern

+0

私はemtpyセルがエラーの理由だと思ったので、すでにそれをしました。しかし、それは数値のためにも機能しません。そして、これらは別のExcelセルから取った値で、パーセントで保存されます。しかし、おそらくこれは何か、我々はここで議論する必要はありません。 (数値によって私はあなたが写真で見ることができるものを意味します) –

0

あなたがformat()機能を使用する場合は、あなたの値はExcelで後でフォーマットさに解釈される文字列に変換します。希望の結果を得るには、.Cells().Value = tb.Value.Cells().NumberFormat = "0.0000%"を使用してください。

+0

いいえ、動作しません。値はまだ '10149316739,000000000000000%' –

+0

のように表示されます。おそらく、あなたがテキストボックスを埋める方法がその理由です...あなたのコードを表示できますか? – Jochen

+0

私はあなたのような価値をExcelシートから得ました(ドイツ語は小数点記号として "、"で上書きされます)。 – Jochen

関連する問題