VBA宏问题

时间:2010-02-26 12:38:02

标签: excel vba

嘿fellas,我有以下VBA代码。

它从Excel工作表中获取值并将其保存在制表符分隔的文本文件中。但是,它会添加列标题。我如何得到行的值,例如从第2行开始,单元格A1,如果列在第1行,单元格A1?感谢。

Sub DoTheExport()
  Dim FileName As Variant
  Dim Sep As String
  FileName = Application.GetSaveAsFilename( _
    InitialFileName:=vbNullString, _
    FileFilter:="Text Files (*.txt),*.txt" _
  )

  If FileName = False Then
    ''# user cancelled, get out
    Exit Sub
  End If
  Sep = vbTab

  Debug.Print "FileName: " & FileName, "Separator: " & Sep

  ExportToTextFile FName:=CStr(FileName), Sep:=CStr(Sep), _
  SelectionOnly:=False, AppendData:=False
End Sub

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

  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


  Application.ScreenUpdating = False
  On Error GoTo EndMacro:
  FNum = FreeFile

  If SelectionOnly = True Then
    With Selection
      StartRow = ActiveSheet.Range("A3").Select
      StartCol = .Cells(1).Column
      EndRow = .Cells(.Cells.Count).Row
      EndCol = .Cells(.Cells.Count).Column
    End With
  Else
    With ActiveSheet.UsedRange
      StartRow = .Cells(3).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

End Sub

2 个答案:

答案 0 :(得分:2)

为什么不仅仅是改变问题:

For RowNdx = StartRow To EndRow

为:

For RowNdx = StartRow+1 To EndRow

这将开始写入从范围中的第二个开始的行。如果要自动检测起始行是否有列标题,则需要检查范围中的第一个单元格(可能使用.Value)并找出如何区分列标题和列标题之间的区别值。

答案 1 :(得分:0)

新用户可能会错误地解释代码开始行和开始列。

StartRow = .Cells(3).Row  
StartCol = .Cells(1).Column

.Cells语法是Cells(索引)或Cells(行,列)

例如。如果范围是工作表,则细胞(1,2)指的是B1。 但是,.Cells(3)指的是使用范围内的第三个小区。如果数据在范围内 4乘4,例如A1到D4,。细胞(5)将参考A2。

如果您想从第二行开始,为什么不使用

startrow = .Cells(2, 1)

清楚地表明要导出的起始数据位于第2行第1列。