【问题标题】:Attempting to store unique strings from text file in Excel using VBA尝试使用 VBA 在 Excel 中存储文本文件中的唯一字符串
【发布时间】:2017-06-16 02:39:22
【问题描述】:

我的一个循环将字符串输入 Excel 时遇到问题。我正在从可以是任意长度的文本文件中提取数据,但到目前为止我使用的所有数据都介于 100 行数据和 50000 行数据之间。我试图提取的字符串长 4 个字符,通常是数字,但可以是字母数字。默认情况下,字符是 0001、0002、0003 和 0004,但如果他们选择使用任何其他 4 个字符,这完全取决于我们的客户。在 Excel 中输入数据时,我只想要输入的唯一值。

可以给出整个代码,但其他一切都很好,所以我认为没有必要。如果您认为是这样,请提出请求,我将对其进行编辑。请记住,我已经尝试了许多不同的尝试,但逻辑似乎永远不会奏效。

结果是一长串行列表,其中包含文本文件中的每个值。

如果我不得不猜测,这是因为字符串是一个数字,然后 Excel 将其存储为“2”而不是“0002”,因此我已将整个列格式化为显示 4 个字符。即便如此,我认为 Excel 将其视为“2”,因此字符串永远不会与数据匹配。

感谢任何帮助。

FileName = Application.GetOpenFilename()
Open FileName For Input As #1

strSearch = "MTRDT"

Do Until EOF(1)
Line Input #1, ReadData
    If Left(ReadData, Len(strSearch)) = strSearch Then
            MtrdtCount = MtrdtCount + 1
            MeterType = Mid(ReadData, 78, 4)
            lastrow = Cells(Rows.Count, "G").End(xlUp).Row + 1
            MeterTypeTest = True

            For Each cell In Range("G3:G" & lastrow)
                If MeterType = cell.Value Then
                    MeterTypeTest = False
                    Exit For
                End If
            Next cell

            If MeterTypeTest = True Then
                Range("G" & MeterTypeCnt) = MeterType
                MeterTypeCnt = MeterTypeCnt + 1

            End If
    Else
    End If
Loop

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    如果您的所有数据均已使用所示方法输入,Excel 将不会将输入为 0002 的数据视为数字 2 - 而是将其视为字符串 "0002"

    但是您正在针对"'" & Mid(ReadData, 78, 4) 测试这些值,这意味着您将比较"0002""'0002"

    您需要在将数据输入单元格时添加 ' 字符,而不是在进行比较之前。所以以下应该工作:

    FileName = Application.GetOpenFilename()
    Open FileName For Input As #1
    
    strSearch = "MTRDT"
    
    Do Until EOF(1)
    Line Input #1, ReadData
        If Left(ReadData, Len(strSearch)) = strSearch Then
            MtrdtCount = MtrdtCount + 1
            MeterType = Mid(ReadData, 78, 4)
            lastrow = Cells(Rows.Count, "G").End(xlUp).Row + 1
            MeterTypeTest = True
    
            For Each cell In Range("G3:G" & lastrow)
                If MeterType = cell.Value Then
                    MeterTypeTest = False
                    Exit For
                End If
            Next cell
    
            If MeterTypeTest Then
                Range("G" & MeterTypeCnt) = "'" & MeterType
                MeterTypeCnt = MeterTypeCnt + 1
            End If
        End If
    Loop
    

    【讨论】:

    • 那是发帖时的错误。当我崩溃并询问时,我正在编辑。感谢您的帮助,将“'”添加到两者并将其更改为 If MeterTypeTest Then work。我尝试将 MeterType 存储为不带 ' 的字符串,并在不带 ' 的情况下进行测试,但遇到了与以前相同的问题。知道那里发生了什么吗?
    • @Cody 如果在单元格中输入"0002" 字符串时没有',Excel 会将其存储为数字2,然后在后来与"0002" 进行比较。 (实际上是将文件中的"0002""2" 进行比较,因为VBA 会将数字2 转换为字符串"2" 来进行比较。)所以在存储数据时需要',但需要记住' 并不是单元格内容的一部分,因此您必须根据"0002" 而不是"'0002" 检查文件中的其他数据。令人困惑?是的。
    • 这就是我认为正在发生的事情。坏事是我必须处理的下一个循环是文本,我可能能够在那里确认问题。感谢您的帮助
    【解决方案2】:

    我认为将“G”列的 numberformatLocal 设置为波纹管

    Columns("g").NumberFormatLocal = "@"
    
    
    Filename = Application.GetOpenFilename()
    Open Filename For Input As #1
    
    strSearch = "MTRDT"
    
    Do Until EOF(1)
    Line Input #1, ReadData
        If Left(ReadData, Len(strSearch)) = strSearch Then
                MtrdtCount = MtrdtCount + 1
                MeterType = Mid(ReadData, 78, 4)
                lastrow = Cells(Rows.Count, "G").End(xlUp).Row + 1
                MeterTypeTest = True
    
                For Each cell In Range("G3:G" & lastrow)
                    If MeterType = cell.Value Then
                        MeterTypeTest = False
                        Exit For
                    End If
                Next cell
    
                If MeterTypeTest = True Then
                    Range("G" & MeterTypeCnt) = MeterType
                    MeterTypeCnt = MeterTypeCnt + 1
    
                End If
        Else
        End If
    Loop
    

    【讨论】:

    • 做到了。第一次运行后,我必须添加语句以删除存储为文本错误的数字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多