копировать и вставлять данные диапазона столько раз, сколько есть заголовков с именами, начинающимися с "X"

avatar
Mido88
1 июля 2021 в 20:54
61
2
-2

Я пытался найти решение этой проблемы, но ничего не вышло.

Вот проблема, с которой я столкнулся. Я хотел бы скопировать диапазон переменных данных с листа под названием («Суммы»), начиная с диапазона «C3», на другой лист с именем («Вставленные суммы») в диапазоне F2 столько раз, сколько столбцов, на листах «Суммы» начиная со следующего значения "Суммы в долларах США".

Я что-то кодировал, но это не работает... Я поместил счетчик в ячейку, чтобы подсчитать, сколько раз есть столбцы, начинающиеся со значения "Суммы в долларах США", чтобы выбрать значение, отображаемое в эту ячейку и повторите процесс вставки. Но я усложнил код, я думаю...

Вот мой код;


Dim cel2 As Range
Dim counter as Integer

With Sheets("Amounts")
Worksheets("Amounts").Activate
      For Each cel2 In Range("A2", Range("A2").End(xlToRight))
         If cel2.Value Like "Amount in USD*" Then
                counter = counter + 1
                Range("U4").Value = counter
          End If
                
          With Worksheets("Pasted Amounts").Activate
            '~Here is bellow the column named " clients name" I want to paste in "Pasted amounts" sheet (by coping it in the sheet "Amounts"
             worksheets("Amounts").Range("C3",range("C3").end(xldown).Select
            '~ Paste the range copied in sheet " Pasted Amount" as many time the counter value is
             .Copy Range("F2").Resize(.Count * counter) 
          End With
     Next cel2

End With

End sub

Еще раз буду очень признателен за вашу помощь...

Мидо88

Источник
Christofer Weber
1 июля 2021 в 21:05
0

Вы можете заменить первое if на WorksheetFunction.CountIf(Range("A2", Range("A2").End(xlToRight)), "Amount in USD*") И вам не нужно активировать лист при использовании with, но вам нужно поставить .Range, иначе он будет ссылаться на активный лист.

Mido88
1 июля 2021 в 21:16
0

Спасибо Кристофер за ваш ответ. Я попытался ввести код, который вы мне посоветовали, но он не сказал. Строка стала красной + я получил сообщение об ошибке компиляции, в котором говорится: «ожидается: =». Ты знаешь почему ?

Christofer Weber
1 июля 2021 в 21:17
0

Я пытаюсь понять последнюю часть. Куда вы копируете и с чего?

Naresh
1 июля 2021 в 21:26
0

Что-нибудь как это?

Mido88
1 июля 2021 в 21:27
0

Хорошо, я хочу скопировать с листа под названием («Суммы») на лист под названием «Вставленная сумма» в ячейке «F2». А на листе под названием «Суммы» есть столбцы, заголовки которых начинаются с «Суммы в долларах США» + другими словами. Дело в том, что я хочу, чтобы Excel автоматически подсчитывал, сколько раз суммы в долларах США появляются в заголовке каждого столбца, чтобы скопировать другой конкретный столбец с именем «Имена клиентов», существующий на этом листе, на другой лист с названием «Вставленные суммы» в диапазоне ( «Ф2»). Вот и все. Вам понятнее? Могу пересказать, если нужно :)

Mido88
1 июля 2021 в 21:30
0

@Naresh Да, каким-то образом, однако я хочу копировать определенный столбец на втором листе столько раз, сколько есть заголовка столбца, начинающегося с «Суммы в долларах США» на первом листе.

Siddharth Rout
1 июля 2021 в 22:02
1

Разве это не похоже на ваш последний вопрос? Просто адаптируйте этот код для работы над этим.

Ответы (2)

avatar
Mido88
2 июля 2021 в 09:21
0

Хорошо, я нашел решение! Еще раз спасибо Сиддхарт и Кристофер, ваши ответы очень помогли мне подумать дальше... Вот решение, которое сработало очень хорошо! Я использовал ответ в предыдущем посте, который я сделал здесь: ссылка и добавил однострочный код, чтобы вставить столько раз, сколько диапазон данных, как «Суммы в долларах США», был найден на предыдущем листе.

Еще раз извините за эти недоразумения. Надеюсь, что мой ответ поможет вам и другим нуждающимся пользователям! Вот он;

Sub Sample()
   Dim wsInput As Worksheet
   Dim wsOutput As Worksheet
   Dim lRowInput As Long
   Dim lRowOutput As Long
   Dim lCol As Long
   Dim i As Long
   Dim Col As String
   
   '~~> Set your sheets here
   Set wsInput = Sheets("Amounts")
   Set wsOutput = Sheets("Pasted Amounts")
   
   With wsInput
       '~~> Find last column in Row 2
       lCol = .Cells(2, .Columns.Count).End(xlToLeft).Column
       
       '~~> Loop through columns
       For i = 1 To lCol
           '~~> Check for your criteria
           If .Cells(2, i).Value2 Like "Amount in functional currency*" Then
               '~~> Get column name
               Col = Split(.Cells(, i).Address, "$")(1)
               
               '~~> Get the last row in that column
               lRowInput = .Range(Col & .Rows.Count).End(xlUp).Row
               
               '~~> Find the next row to write to
               If lRowOutput = 0 Then
                   lRowOutput = 2
               Else
                   lRowOutput = wsOutput.Range("A" & wsOutput.Rows.Count).End(xlUp).Row + 1
               End If
               
               '~~> Copy the datas ( for each column where Amounts in USD was found)
               .Range(Col & "3:" & Col & lRowInput).Copy _
               wsOutput.Range("A" & lRowOutput)

               ~~> SOLUTION BELLOW-Copy the variable data range ("C3") 
                Worksheets("Amounts").Activate
               .Range("C3", Range("C3").End(xlDown)).Copy wsOutput.Range("F" & lRowOutput)
           End If
       Next i
   End With
End Sub

Мидо

avatar
Christofer Weber
1 июля 2021 в 21:30
0
Sub test()
Dim LastColumn As Long, LastRow As Long, counter as Long
With Sheets("Amounts")
    LastColumn = .Cells(1, .Columns.Count).End(xlToLeft).Column
    LastRow = .Cells(.Rows.Count, "C").End(xlUp).Row
    counter = WorksheetFunction.CountIf(.Range("A1", .Cells(1, LastColumn)), "Amount in USD*")
    .Range("C3:C" & LastRow).Copy _
    Worksheets("Pasted Amounts").Range("F2").Resize(.Range("C3:C" & LastRow).Count * counter)
End With
End Sub

Или глупо длинной строкой кода:

Sub test()
Sheets("Amounts").Range("C3:C" & Sheets("Amounts").Cells(Sheets("Amounts").Rows.Count, "C").End(xlUp).Row).Copy Worksheets("Pasted Amounts").Range("F2").Resize(Sheets("Amounts").Range("C3:C" & Sheets("Amounts").Cells(Sheets("Amounts").Rows.Count, "C").End(xlUp).Row).Count * WorksheetFunction.CountIf(Sheets("Amounts").Range("A1", Sheets("Amounts").Cells(1, Sheets("Amounts").Cells(1, Sheets("Amounts").Columns.Count).End(xlToLeft).Column)), "Amount in USD*"))
End Sub
Mido88
1 июля 2021 в 21:45
0

Спасибо, Кристофер, к сожалению, это не то, чего я ожидал. Извините за мой плохой английский. Я обновил пост и внес некоторые изменения в опубликованный код. Это должно быть более понятно. Если все еще не скажи мне, ха-ха

Christofer Weber
1 июля 2021 в 21:50
0

@ Mido88 Вы хотите полностью скопировать C3:Cx в F2:Fx? А потом сделать это снова для каждого счетчика? Например, от C3: C4 до F2: F6, если счетчик равен 2? ИЛИ вы хотите скопировать столько C3:Cx, сколько счетчик, то есть C3:C6 в F2:F5, если счетчик равен 3?

Mido88
1 июля 2021 в 21:58
0

"Хотите ли вы полностью скопировать C3:Cx в F2:Fx? И затем сделать это снова для каждого из счетчиков? Например, C3:C4 в F2:F6, если счетчик равен 2?"==> ДА !! это то, что я хочу! :)

Christofer Weber
1 июля 2021 в 22:07
0

@ Mido88 А как насчет этого? А если нет, то что не работает должным образом?