2010-02-26 3 views
1

Привет, ребята, у меня есть следующий код VBA.VBA macro issue

Он получает значения из листа 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

Почему это не просто вопрос изменения:

For RowNdx = StartRow To EndRow 

к:

For RowNdx = StartRow+1 To EndRow 

Это будет начать писать строки, начиная со второго диапазона. Если вы хотите автоматически определить, имеет ли стартовая строка заголовки столбцов, вам нужно будет проверить первую ячейку диапазона (с вероятностью .Value) и выяснить, как определить разницу между заголовком столбца и значением.

0

Начальная строка кода и начало col могут быть неверно истолкованы новыми пользователями.

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

.Cells синтаксис клетка (индекс) или клетка (строка, столбец)

Например .Cells (1, 2) относится к B1, если диапазон лист. Однако, Cells (3) относится к третьей ячейке в используемом диапазоне. Если данные находятся в диапазоне
4 на 4, например, от A1 до D4, .Цел. (5) относятся к A2.

Если вы хотите, чтобы начать на втором ряду, то почему бы не использовать

startrow = .Cells(2, 1) 

четко указывают данные, начиная с экспорта находится в строке 2, столбец 1.