简体   繁体   English

Excel宏-在同一级别的单元格中运行

[英]Excel macro - running through cells on the same level

So I want to run through A1-C200 and paste everything into a Word document. 所以我想遍历A1-C200并将所有内容粘贴到Word文档中。 The trouble is, I have two ways of pasting it into Word, but each one has its downfall. 麻烦的是,我有两种方法将其粘贴到Word中,但是每种方法都有其缺点。

Goal: Copy A1-C200 into Word and keep the column layout, without copying blancs. 目标:将A1-C200复制到Word中并保留列布局,而不复制空白。

Example 1: 范例1:

The code below copies everything into Word, but runs from A1 -> A200, B1 -> B200, C1 -> C200. 下面的代码将所有内容复制到Word中,但从A1-> A200,B1-> B200,C1-> C200运行。 Because it reads through my file this way, I lose my column layout. 因为它以这种方式读取我的文件,所以我失去了列的布局。 I would prefer a solution for this example, because this code looks clearer to me. 我希望此示例具有解决方案,因为这段代码对我而言更清晰。

iMaxRow = 200

" Loop through columns and rows"
For iCol = 1 To 3
    For iRow = 1 To iMaxRow

    With Worksheets("GreatIdea").Cells(iRow, iCol)
        " Check that cell is not empty."
        If .Value = "" Then
            "Nothing in this cell."
            "Do nothing."
        Else
            " Copy the cell to the destination"
            .Copy
            appWD.Selection.PasteSpecial
        End If
    End With

    Next iRow
Next iCol

Example 2: 范例2:

The code below copies the correct column layout, but also inserts blancs. 下面的代码复制正确的列布局,但也插入空白。 So if A1-A5 and A80-A90 are filled in, I will have 75 blancs in my Word document. 因此,如果填写了A1-A5和A80-A90,我的Word文档中将有75个空白。

a1 = Range("A1").End(xlDown).Address
lastcell = Range("C1").Address
Range(a1, lastcell).Copy
With Range("A1") 
Range(.Cells(1, 1), .End(xlDown).Cells(2, 3)).Copy
End With
Range("A1:C50").Copy
appWD.Selection.PasteSpecial

not quite sure I understand the prob ... but here's a stab at it: 不太确定我了解这个问题了……但这是一个刺痛的事情:

dim rg200x3 as range: set rg200x3 = range("a1:c200")

dim Col1 as new collection
dim Col2 as new collection
dim Col3 as new collection

dim rgRow as new range
dim sText as string
for each rgRow in rg200x3
    sText = trim(rgRow.cells(1,1)): if (sText <> "") call Col1.Add(sText)
    sText = trim(rgRow.cells(1,2)): if (sText <> "") call Col2.Add(sText)
    sText = trim(rgRow.cells(1,3)): if (sText <> "") call Col3.Add(sText)
next rgRow

at this point Col1, Col2, and Col3 contain your text w the blank cells factored out, so now loop over these to print out 此时,Col1,Col2和Col3包含您的文本,其中包含空白单元格,因此现在循环遍历以打印出

dim i as long
for i = 1 to 200
    on error resume next  ' (cheap way to avoid checking if index > collection sz)
    debug.print Col1(i) + " | " Col2(i) + " | " + Col3(i)
    on error goto 0
next i

(note: code typed in freehand with no checking ... ) (注意:徒手输入的代码,没有检查...)

How about this to sub for your first solution: 如何将其归类为您的第一个解决方案:

iMaxRow = 200

" Loop through columns and rows"
For iRow = 1 To iMaxRow
  For iCol = 1 To 3

    With Worksheets("GreatIdea").Cells(iRow, iCol)
      " Check that cell is not empty."
      If .Value = "" Then
          "Nothing in this cell."
          "Do nothing."
      Else
           "Copy the cell to the destination"
          .Copy appWD.Selection.PasteSpecial
      End If
    End With

  Next iCol
Next iRow

There's multiple ways to do this, don't know which is the quickest but here's some code I threw together real quick for you. 有多种方法可以做到这一点,不知道哪一种是最快的,但是这里有些代码是我为您快速准备的。 Getting the range all at once in a variant is the fastest way to grab data out of excel. 一次获取全部范围是从Excel中获取数据的最快方法。

Sub test()

        Dim i As Long, j As Long
        Dim wd As Word.Document
        Dim wdTable As Word.Table
        Dim wks As Excel.Worksheet
        Dim v1 As Variant
        Set wd = GetObject("C:\Documents and Settings\Jon\Desktop\New Microsoft Word Document.doc")

'Get data in array
        Set wks = ActiveSheet
        v1 = wks.UsedRange        

'Create table
        Set wdTable = wd.Tables.Add(Range:=wd.Application.Selection.Range, NumRows:=1, NumColumns:= _
            ubound(v1,2), DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _
            wdAutoFitFixed)


        'Place data
        For i = 1 To UBound(v1)
            For j = 1 To UBound(v1, 2)
                If Len(v1(i, j)) > 0 Then
                    'Add row if not enough rows, this can be done before the j loop if
                    'you know the first column is always filled.
                    'You can also do an advanced filter in excel if you know that the first
                    'column is filled always and filter for filled cells then just
                    'do a straight copy and paste using r1.specialcells(xlCellTypeVisible).copy 
                    'If you know the rows ahead of time when you create the table you can create all the rows at once,
                     'which should save time.
                    wd.application.selection
                    If wdTable.Rows.Count < i Then wdTable.Rows.Add
                    wdTable.Cell(i, j).Range.Text = v1(i, j)
                End If
            Next j
        Next i

        Set wks = Nothing: Set wd = Nothing: Set v1 = Nothing
    End Sub

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM