1

为什么下面的代码在 Excel 工作表中不起作用?此代码根据用户选择将excel文件转换为文本文件,选择可以导出完整的excel表或选定范围,用户也可以选择文本文件的分隔符。我已经在 excel 表单中测试了这段代码,它运行良好,但是如果将用户表单更改为嵌入到 excel 表单中,它就不能完全运行。它确实会生成文本文件,但所有值都是空白的,知道吗?

Public Sub ExportToTextFile(FName As String, SourceFile As String, _
Sep As String, SelectionOnly As Boolean, _
AppendData As Boolean)

Dim wb As Workbook
Dim ws As Worksheet
Dim WholeLine As String
Dim FNum As Integer
Dim RowNdx As Long
Dim ColNdx As Integer
Dim StartRow As Long
Dim EndRow As Long
Dim StartCol As Integer
Dim EndCol As Integer
Dim CellValue As String

 StarRange = StrCol & StrRow
 EndRange = EndCols & endrows


 Application.ScreenUpdating = False
 On Error GoTo EndMacro:
 FNum = FreeFile
 Set wb = Workbooks.Open(SourceFile)
 Set ws = wb.Sheets("Sheet1")


If SelectionOnly = True Then
With ActiveSheet.UsedRange
    StartRow = .Cells(1).Row
    StartCol = .Cells(1).Column
    EndRow = .Cells(.Cells.Count).Row
    EndCol = .Cells(.Cells.Count).Column
End With
Else

With ActiveSheet.Range(StarRange & ":" & EndRange)

    StartRow = .Cells(1).Row
    StartCol = .Cells(1).Column
    EndRow = .Cells(.Cells.Count).Row
    EndCol = .Cells(.Cells.Count).Column
End With
End If

If AppendData = True Then
Open FName For Append Access Write As #FNum
Else
Open FName For Output Access Write As #FNum
End If
 For RowNdx = StartRow To EndRow
WholeLine = ""
For ColNdx = StartCol To EndCol
    If Cells(RowNdx, ColNdx).Value = "" Then
        CellValue = Chr(34) & Chr(34)
    Else
       CellValue = Cells(RowNdx, ColNdx).Value
    End If
    WholeLine = WholeLine & CellValue & Sep
Next ColNdx
WholeLine = Left(WholeLine, Len(WholeLine) - Len(Sep))
Print #FNum, WholeLine
Next RowNdx

EndMacro:
On Error GoTo 0
Application.ScreenUpdating = True
Close #FNum
MsgBox "Completed.", vbInformation
 ActiveWorkbook.Close
 End Sub
4

1 回答 1

2

查看您的代码:

Dim StartRow As Long
Dim EndRow As Long
Dim StartCol As Integer
Dim EndCol As Integer
Dim CellValue As String

 StarRange = StrCol & StrRow
 EndRange = EndCols & endrows

我怀疑您的变量名中有一些拼写错误。是StartRow还是StrRow,例如?

在不使用细齿梳为您进行调试的情况下,我强烈建议您始终使用

Option Explicit

在每个模块的开头。这告诉 VBA“不要让我使用我没有明确声明的任何变量”——这实际上意味着(大多数情况下)“如果我拼错了变量,请警告我”。

我还注意到您ws在该行中设置了一个变量

Set ws = wb.Sheets("Sheet1")

然后继续不使用它。Portland Runner 就如何使用这样的变量发布了一个很好的建议——尽管没有看到你的代码/表单的其余部分,不清楚这是否对你有更好的工作。通常“ActiveSheet”是个坏主意——它通常是录制宏的遗留物,但不是最有效或最便携的事情。

看起来您从几个不同的地方获取代码并重新调整了它的用途。我建议您逐行浏览并确保需要每一行,并按照您的意愿行事。

最后,作为调试过程的一部分,我将在该行中放置一个断点 (F9)

WholeLine = ""

然后逐步查看是否按照您的想法形成了行(输入范围正确,格式正确,行写入正确)。我的怀疑在于您定义输入范围的方式。StartRow等实际上是您StartCol希望它们成为的样子吗?

最后(可能最重要的是)在行中

For ColNdx = StartCol To EndCol
    If Cells(RowNdx, ColNdx).Value = "" Then
        CellValue = Chr(34) & Chr(34)
    Else
       CellValue = Cells(RowNdx, ColNdx).Value
    End If
    WholeLine = WholeLine & CellValue & Sep
Next ColNdx

您参考Cells- 但不参考这些单元格所属的工作簿/工作表。我怀疑 VBA 引用的差异表超出了您的预期。再次 - 如果您正确创建ws变量,则应将这些行更改为

For ColNdx = StartCol To EndCol
    If ws.Cells(RowNdx, ColNdx).Value = "" Then
        CellValue = Chr(34) & Chr(34)
    Else
       CellValue = ws,Cells(RowNdx, ColNdx).Value
    End If
    WholeLine = WholeLine & CellValue & Sep
Next ColNdx

这很可能会解决您的问题。

于 2013-11-11T04:51:54.407 回答