【问题标题】:Save as .csv correct decimal separator另存为 .csv 正确的小数分隔符
【发布时间】:2015-11-12 12:07:29
【问题描述】:

我正在编写一个“主”Excel 文档,该文档使用 Visual Basic for Applications 创建新工作簿并将它们保存为“.csv”。创建的工作簿包含来自两个来源的测量数据。一个来源已经在我的区域设置中提供了测量日期(荷兰,其中逗号, 符号通常用作小数分隔符)。然而,另一个来源以点 . 作为分隔符(美国设置)提供数据。我想用逗号符号替换所有点符号。

这可以通过替换功能实现吗?

(我猜这个解决方案只会在应用于大于 1.000,00(或美国设置为 1,000.00)的值时失败。这是可以接受的,但远非完美。

目前的尝试

  • Application.DecimalSeperator = ","
  • 在保存工作簿的行之后添加local = true

另外

Excel 认为文本文档中的值有 1000 个分隔符 31.435。当我打开 1000 分隔符时,值为 31435。我需要它为 31,435(以逗号分隔的十进制,符号)

我需要调整单元格格式吗?
如果是这样,那么...如何?
还有其他解决方法吗?

Anwser/Solution(最适合我)

Sheets(SheetNaamCNC).Range("B1").Select
Do While ActiveCell.Value <> ""
    If InStr(ActiveCell.Value, "0,") = 0 Then
        ActiveCell.Value = ActiveCell.Value / 1000
    End If
    ActiveCell.Offset(1, 0).Select
Loop

【问题讨论】:

  • 数据如何从“来源”进入您的电子表格?在这一步修复格式可能比试图解开 Excel 之后如何误解它更容易。
  • 来源一,CNC 铣床上的 Touche 探针,它将文本文档发送到笔记本电脑(或 pc)。我的宏代码从中提取数据......但铣床只能提供以点为分隔符的测量数据。来源二、数显卡尺测量装置。用电缆连接到笔记本电脑。它将数据输入到主文件的一张表中,并给我以小数分隔的 bij 值,(所以工作正常)

标签: vba excel csv decimal


【解决方案1】:

你可以使用下面的函数

Sub sub1()
    Application.DecimalSeparator = "."
    Application.ThousandsSeparator = ","
    Application.UseSystemSeparators = False
    Plan1.Columns(1).NumberFormat = "#,##0.00"
End Sub

【讨论】:

  • 谢谢!我试试看
  • 这很可能会给你带来很多麻烦,因为1.000,00 (or 1,000.00 for US settings) 所以字符串中同时存在,.,替换只会乱七八糟提高价值。
  • 对不起,我错过了,我用其他可能的解决方案编辑了我的代码
【解决方案2】:

当您使用 数据 选项卡 > 获取外部数据 > 从文本将文本文件读入 Excel 工作表时,您可以指定在文本文件导入向导的第 3 步中单击 Advanced 按钮,即可得到小数点和千位分隔符。

如果您在导入其中一个数据文件时录制宏,您会得到如下内容:

With ActiveSheet.QueryTables.Add(Connection:= _
    "TEXT;myfilename.csv" _
    , Destination:=Range("$A$1"))
    .Name = "myfilename"
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = 850
    .TextFileStartRow = 1
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = False
    .TextFileSemicolonDelimiter = False
    .TextFileCommaDelimiter = True
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1)
    .TextFileDecimalSeparator = ","
    .TextFileThousandsSeparator = " "
    .Refresh BackgroundQuery:=False
End With

然后您可以使用记录的代码来开发您自己的宏,该宏将以正确的格式导入未来的数据文件 - 请特别参阅 TextFileDecimalSeparatorTextFileThousandsSeparator 属性。

【讨论】:

    【解决方案3】:

    如果它以文本形式读取它们,您可以尝试

    =SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(sheet1!A2,",","|"),".",","),"|",".")
    

    如果我这样做,我会在新工作表的同一列中为我想要重新格式化的每一列输入这个公式,然后使用复制任何其他列

    =sheet1!B2 etc.
    

    这是否是一个可行的解决方案取决于您有多少列。

    【讨论】:

    • 我打算将此添加到我的答案中,对于您要更改的每一列,必须在新列或工作表中输入此公式。
    【解决方案4】:

    已经同意设置 , 作为分隔符。这适用于像 0,234 这样的值,但像 31,345 这样的值会失败。它们显示为 31.345(在本例中使用 . 作为千位分隔符)。 可能的解决方案 逐个循环遍历单元格。如果第一个字符不等于“0”,则将 ActiveCell.Value 除以 1000。 有点绕路……但我想这对我有用。

    添加以下内容,

    Sheets("YourSheetName").Range("TopOfRangeYouLikeToEdit").Select
    Do While ActiveCell.Value <> ""
        If Left(ActiveCell.Value, 1) <> "0" Then
            ActiveCell.Value = ActiveCell.Value / 1000
        End if
        ActiveCell.Offset(1,0).Select
    Loop
    

    -Cornelis 编辑: 而不是Left(ActiveCell.Value,1)&lt;&gt; "0"

    If ActiveCell.Value < 0 Then  
    

    会更好

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-23
      • 2015-04-05
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      • 2015-12-08
      • 2019-06-09
      相关资源
      最近更新 更多