excel 通过VBA传输数据[已关闭]

xzabzqsa  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(132)

已关闭,此问题需要更focused,目前不接受回答。
**要改进此问题吗?**更新问题,使其仅关注editing this post的一个问题。

3天前关闭。
Improve this question
在我的工作簿中有64个选项卡,每个工作表都包含与每个工作表页面上的付款相关的信息。每个工作表页面的名称位于A2:名为“制表符”的工作表的A65范围。
每个工作表由A列和S列之间的信息组成。B列中白色背景上写的公司将在该周支付,而不同颜色的公司将在该周不支付。
从这些选项卡中,我想将B/I/J/O/P/Q/R列中的信息一个接一个地复制和粘贴到另一个工作簿中。我使用“O”列作为分隔信息的参考,因为它只包含将收到付款的公司的付款信息。这使我更容易分隔信息,因为它们也是写在白色背景上的。
事实上,我只是想将所有写在白色背景上的信息复制并转移到另一个工作表中。
在使用ChatGPT时,下面的代码很大程度上解决了我的单个标签的问题。然而,有一个问题我无法克服。正如你在照片中看到的那样,有时候,在列I和J中并不只有一行并排的信息。还有几条信息彼此在下面。当我试图将这些信息复制并粘贴到所需的页面时,我在传输这些信息时遇到了麻烦。

ChatGPT代码

Sub KopyalaYapistir1()

'Kopyalanacak verilerin bulunduğu çalışma kitabını aç
Workbooks.Open "C:\Users\emir.DEMTA\Desktop\Dosya\Ödeme Listesi.xlsb"

'Kopyalanacak verilerin bulunduğu çalışma sayfasını tanımla
Dim kopyalanacakSayfa As Worksheet
Set kopyalanacakSayfa = Workbooks("Ödeme Listesi.xlsm").Worksheets("Çalışma Sayfası")

'Yapıştırılacak hedef sayfayı tanımla
Dim hedefSayfa As Worksheet
Set hedefSayfa = Workbooks("Satınalma Çalışma.xlsm").Worksheets("Hedef Sayfa")

'Her satır için döngü yap
Dim satir As Integer
satir = 7 'ilk satır

Do While satir <= 214 'son satır
    'O sütunu doluysa
    If kopyalanacakSayfa.Cells(satir, "O").Value <> "" Then
        'Kopyalanacak verileri ayrı ayrı tanımla
        Dim bDegeri As String
        Dim ıDegeri As String
        Dim jDegeri As String
        Dim oDegeri As String
        Dim pDegeri As String
        Dim qDegeri As String

        bDegeri = kopyalanacakSayfa.Cells(satir, "B").Value
        ıDegeri = kopyalanacakSayfa.Cells(satir, "I").Value '& " " & kopyalanacakSayfa.Cells(satir + 1, "I").Value
        jDegeri = kopyalanacakSayfa.Cells(satir, "J").Value '& " " & kopyalanacakSayfa.Cells(satir + 1, "J").Value
        oDegeri = kopyalanacakSayfa.Cells(satir, "O").Value
        pDegeri = kopyalanacakSayfa.Cells(satir, "P").Value
        qDegeri = kopyalanacakSayfa.Cells(satir, "Q").Value

        'Hedef sayfadaki ilk boş hücreyi bul ve kopyalanan verileri ilgili sütunlara yapıştır
        Dim hedefHucre As Range
        Set hedefHucre = hedefSayfa.Cells(hedefSayfa.Rows.Count, "A").End(xlUp).Offset(1, 0)
        hedefHucre.Value = bDegeri
        hedefHucre.Offset(0, 1).Value = ıDegeri
        hedefHucre.Offset(0, 2).Value = jDegeri
        hedefHucre.Offset(0, 3).Value = oDegeri
        hedefHucre.Offset(0, 4).Value = pDegeri
        hedefHucre.Offset(0, 5).Value = qDegeri
    End If
    satir = satir + 1 'bir sonraki satıra geç
Loop

    'Kopyalanacak verilerin bulunduğu çalışma kitabını kapat
    Workbooks("Ödeme Listesi.xlsm").Close

End Sub

有没有人可以帮助我解决这个问题?
我试着用微观的方法来解决这个问题,我大部分都成功了,但我很难用更宏观的方法来解决这个问题。

5ssjco0h

5ssjco0h1#

我不确定我是否正确理解了你...
无论如何,下面的代码是基于下面的报价:
实际上,我只是想将所有写在白色背景上的信息复制并转移到另一个工作表中。从这些选项卡中,我想复制并粘贴列B/I/J/O/P/Q/R中的信息
所以我的猜测是,你想复制的信息写在单元格没有填充颜色列B/I/J/O/P/Q/R从所有工作表/标签,除了工作表“标签”
其余的解释被忽略了,图片中红色的信息也被忽略了,因为我不完全理解它。例如:
我想将B/I/J/O/P/Q/R列中的信息复制并粘贴到另一个工作簿中,一个接一个
我不明白你是什么意思.所以代码不会复制到另一个工作簿,但复制到一个新的工作表在同一工作簿有64工作表/标签.(以后你可以保存这个新工作表作为一个新的工作簿).
首先,复制一个有64个工作表/标签的工作簿,然后创建一个新的工作表,将其命名为“结果”,并将单元格A1:G3中的任何值放入工作表结果中。然后复制/粘贴下面的子,然后运行它进行测试。
下面的宏假设只在B列(Firma)中合并行,并且数据从第4行开始。除了B列,没有合并行。
宏将从所有现有工作表中复制基于B列中合并单元格的所有数据因此,从第4行A列开始,工作表Result中的数据只是没有填充颜色的合并单元格数据,并且每个公司名称之间没有空行。从B列到G列,没有合并的单元格,并且B到G中的单元格具有填充颜色或不具有填充颜色。

Sub test()
Dim shRslt As Worksheet, sh As Worksheet
Dim rg As Range, cell As Range, rgU As Range, rgColor As Range
Dim colS As Integer, colE As Integer
Dim arrCol, col

Application.ScreenUpdating = True

Set shRslt = Sheets("Result")
shRslt.Activate
arrCol = Array("i", "j", "o", "p", "q", "r")

For Each sh In Sheets
If sh.Name <> "Result" And sh.Name <> "Tabs" Then
    Set rg = sh.Range("B4", sh.Range("B" & Rows.Count).End(xlUp)).SpecialCells(xlConstants)

    For Each cell In rg.Areas
        colS = cell.Column
        If cell.Interior.ColorIndex = xlNone Then
            If rgU Is Nothing Then Set rgU = cell Else Set rgU = Union(rgU, cell)
           For Each col In arrCol
           colE = Range(col & "1").Column
           Set rgU = Union(rgU, cell.Offset(0, colE - colS).Resize(cell.Rows.Count, 1))
           Next
        End If
    Next
    
rgU.Copy Destination:=shRslt.Range("a" & Rows.Count).End(xlUp).Offset(1, 0)
Set rgU = Nothing

End If
Next sh

'set the data range in column B:G starting from row 4 as rg variable
    With shRslt.UsedRange
        Set rg = .Resize(.Rows.Count - 3, .Columns.Count - 1).Offset(3, 1)
    End With

'get all cells with color as rgColor variable
    Application.FindFormat.Interior.ColorIndex = xlNone
    With rg
        v = .Value
        .ClearContents
        .Replace "", True, xlWhole, , False, , True, False
        Set rgColor = .SpecialCells(xlBlanks)
        .Value = v
    End With
    
'clear the rgColor (the cells with fill color) at once
    rgColor.Clear
    
Application.ScreenUpdating = True

End Sub

逐行运行代码,检查它是否运行正常。
从所有选项卡/工作表复制数据后的工作表结果示例(工作表“结果”本身和工作表“选项卡”除外)

清除带有填充颜色的单元格后的工作表“结果”:

相关问题