vba вставить значение, скопированное в переменную (application.onkey)

#excel #vba

#excel #vba

Вопрос:

я объясню, в чем моя проблема, что я хочу получить и как я хотел бы сделать, но не могу.

Итак, сначала вот то, что мне нужно,

у меня есть какой-то календарь с некоторыми датами в нем, как это: [1]: https://i.stack.imgur.com/w7NLO.png

то, что я хочу сделать, это скопировать значение (строку) в другую ячейку, но если в другой ячейке есть значение (строка), значение в нем и значение копируются до того, как они объединят друг с другом строки, что-то вроде этого:

введите описание изображения здесь

читая в Интернете, я нашел то, что мне нужно, но я не могу заставить это работать, я хотел бы передать значение, скопированное с помощью ctrl c, в переменную, а затем с помощью пользовательского ярлыка вставить в другую ячейку, и если в ячейке есть что-то, что они объединяют друг с другом строки, как на картинке выше

я думал о подобном коде, но он явно не работает

     Sub g()
    Application.OnKey "^e", "test"

     End Sub


  Sub TEST()
 Dim l As String
  l = PasteSpecial

  If ActiveCell.Value <> "" Then
       ActiveCell.Valueamp; " " amp; l
   ElseIf ActiveCell.Value = "" Then
         ActiveCell.Value = l
  End If


  End Sub
 

я знаю, что то, что я написал, выглядит глупо, но я не знаю, как работает onkey

заранее спасибо

Криштиану

Комментарии:

1. Вам это нужно для конкретной ячейки или для итерации между несколькими такими ячейками? Затем, откуда следует взять добавляемое значение?

2. нет, не для конкретной ячейки, которая мне нужна, по одной ячейке за раз, но ячейка может быть где угодно

3. @FaneDuru значение может быть взято из любой ячейки, но в той же строке

4. Я опубликовал код, просто адаптирующий ваш… Это то, что вам нужно?

5. @FaneDuru код в порядке, но «моя строка» (l в вашем коде) должна быть значением, которое я скопировал ранее с помощью ctrl c,

Ответ №1:

Пожалуйста, попробуйте следующий тестовый код. Его можно адаптировать для работы с итерацией диапазона:

 Sub TEST()
 Dim l As String
  l = "My String"

  ActiveCell.value = ActiveCell.value amp; IIf(ActiveCell.value = "", "", "   ") amp; l
End Sub
 

Или взять значение из другой ячейки:

 Sub TEST()
 Dim l As String
  l = ActiveCell.Offset(0, 2).Value 'the value in the second column refering the active cell

  ActiveCell.value = ActiveCell.value amp; IIf(ActiveCell.value = "", "", "   ") amp; l
End Sub
 

Отредактировано:

Моя последняя попытка:

 Sub testCopyfromTheSameRow()
  Dim ICol As Long
  
  ICol = 3 'The column number where the value to be copied
   ActiveCell.value = ActiveCell.value amp; ActiveSheet.cells(ActiveCell.row, ICol).value

End Sub
 

Комментарии:

1. это примет значение l во втором столбце из активной ячейки, но столбец не исправлен, мне нужно взять значение в той же строке, но из разных столбцов

2. я попробовал этот Sub PasteSpecialAdd(), если ActiveCell.value = «», Затем ActiveCell.PasteSpecial xlPasteAll, Еще ActiveCell.PasteSpecial Вставить:=xlPasteAll, Операция:=xlAdd End, если End Sub, но это не работает

3. @Cristiano Morresi: Вы уверены, что знаете, что вам нужно, без обид? Если да, можете ли вы попробовать задать вопрос таким образом, чтобы мы поняли, что нужно сделать? Что должны означать «разные столбцы»? То, что я опубликовал, было, конечно , примером… Я спросил вас об итерации, и вы ничего не сказали. Если вам нужен фрагмент кода, чтобы делать «то, что вам нужно», вы должны лучше объяснить, что означает эта концепция.

4. конечно, я не обижаюсь, да, я знаю, что мне нужно, просто я не могу заставить это работать, хорошо, я постараюсь лучше объяснить

5. @Cristiano Morresi: Перед тестированием кода вы что-то помещали в буфер обмена? Я имею в виду, вы нажали Ctrl C в ячейке, в которую хотите вставить ее значение? Вы понимаете концепцию буфера обмена?

Ответ №2:

наконец я это сделал

это решение, которое я нашел благодаря предложению @faneduru

Дополнительный ТЕСТ ()

     Dim l As String
      l = ActiveCell.Value

    If ActiveCell.Value = "" Then
       ActiveCell.PasteSpecial xlvalue
    Else
       ActiveCell.PasteSpecial Paste:=xlvalue
       ActiveCell.Value = l amp; ActiveCell.Value
    End If
 

End Sub

Комментарии:

1. Гораздо лучше избегать использования буфера обмена. Изменяя существующее значение ячейки, она все равно сохранит свой формат. Вы хотите вручную скопировать ячейки, а затем использовать приведенный выше код? Это намного проще и быстрее в простом использовании Activecel.Value = TheOtherCell.Value . Конечно, обусловливая пустоту, как вы видите в моих предыдущих предложениях.

2. да, я хочу скопировать вручную, а затем использовать приведенный выше код, да, это проще, но я не знаю, какую ячейку я собираюсь скопировать, для этого мне было проще скопировать вручную, а затем вставить с кодом.

3. Если вы не можете определить логику, лежащую в основе поиска необходимой ячейки, код вам вообще не поможет. Вы можете быстрее вручную вставить скопированное значение… Но вы можете действовать так, как хотите.

4. @faneduru я, возможно, нашел способ избежать использования буфера обмена, просто из любопытства, почему лучше избегать использования буфера обмена? Простите мои вопросы и спасибо за помощь

5. Для простого кода требуется больше ресурсов Excel, и код выполняется не слишком быстро. Если вы нашли такой способ, молодец! Даже если ничего не нужно искать. Мой ответ ясно показывает, как действовать с этой точки зрения…