嵌入Excel工作表中的表单时,函数不起作用

时间:2013-11-11 01:35:55

标签: excel excel-vba vba

为什么下面的代码在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

1 个答案:

答案 0 :(得分: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 = ""

然后逐步查看是否按照您的想法形成线条(输入范围正确,格式正确,线条正确写入)。我的怀疑在于你定义输入范围的方式。 StartRowStartCol等实际上是您想要的吗?

最后(也可能是最重要的)行

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

这可能很好地解决了你的问题。