Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > Visual Basic
Перезагрузить страницу При клике по ячейке, скопировать её содержимое в другую книгу
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
melkii_add melkii_add вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.05.2008
По умолчанию При клике по ячейке, скопировать её содержимое в другую книгу - 19.05.2008, 17:32

Доброго времени суток всем!
Столкнулся с проблемкой...
Задача: При клике по ячейке, скопировать её содержимое в другую книгу, в определённый столбец, в следующую за последней заполненной ячейкой ячейку...
Вроде всё просто... но все перепробованные мной варианты иливовсе не копируют(скорее всего неправильное применение кода) или копируют не в последнюю заполненную, а намного ниже...

вот часть кода:

Код:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With ActiveCell
    .Copy (Workbooks("Constructor").Worksheets("Smeta").Cells(Workbooks("Constructor").Worksheets("Smeta").Columns("C").Find(What:="*", LookIn:=xlValues, SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row + 1, 3))
    .Offset(0, -1).Copy (Workbooks("Constructor").Worksheets("Smeta").Cells(Workbooks("Constructor").Worksheets("Smeta").Columns("B").Find(What:="*", LookIn:=xlValues, SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row + 1, 2))
    .Offset(0, 5).Copy (Workbooks("Constructor").Worksheets("Smeta").Cells(Workbooks("Constructor").Worksheets("Smeta").Columns("E").Find(What:="*", LookIn:=xlValues, SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row + 1, 5))
End With
ActiveCell.Font.ColorIndex = 3
End Sub
тут копирование трёх ячеек...
и при копировании получается "лесенка" (то есть при копировании второй ячейки она копируется на одну ниже требуемой, а третья - ниже второй), а по задумке они должны скопироваться в один ряд...

кто видит ошибку?
(или ошибка в ДНК? )
Ответить с цитированием
  (#2 (permalink)) Старый
Pavel55 Pavel55 вне форума
Member
 
Сообщений: 226
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 11.07.2006
По умолчанию 20.05.2008, 20:07

Код:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Selection.Cells.Count > 1 Then Exit Sub
    With Workbooks("Constructor.xls").Worksheets("Smeta")
        .Cells(.Cells(Rows.Count, "B").End(xlUp).Row + 1, "B") = Target
        .Cells(.Cells(Rows.Count, "C").End(xlUp).Row + 1, "C") = Target
        .Cells(.Cells(Rows.Count, "E").End(xlUp).Row + 1, "E") = Target
    End With
    ActiveCell.Font.ColorIndex = 3
End Sub
Ответить с цитированием
  (#3 (permalink)) Старый
melkii_add melkii_add вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.05.2008
По умолчанию 21.05.2008, 12:09


как всё на самом деле просто!! О_О
спасибо громадное, Павел!!
вы спасали меня уже пару раз
очень благодарен!
Ответить с цитированием
  (#4 (permalink)) Старый
melkii_add melkii_add вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.05.2008
По умолчанию 21.05.2008, 20:10

Павел, я не смог до конца понять принцип работы ".Cells(.Cells(Rows.Count, "C").End(xlUp).Row + 1, "C") = Target"
можно ли сделать offset от активной ячейки и значение той ячейки скопировать в другую книгу?

то есть :
кликаем по ячейке из столбца "С" и при клике происходит копирование значений из ячеек "С" , "В" , "Н" в другую книгу в ячейки "С" , "В" , "Н" соответственно?

так как приведённый код копирует только значение ячейки из столбца "С"

или можете в двух словах описать работу этого метода?
".Cells(.Cells(Rows.Count, "C").End(xlUp).Row + 1, "C") = Target"

с Уважением, Вадим.
Ответить с цитированием
  (#5 (permalink)) Старый
Nasek Nasek вне форума
Member
 
Сообщений: 12
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 20.02.2015
По умолчанию 20.02.2015, 20:28

Подскажите, пожалуйста, как создать код. позволяющий копировать содержимое ячейки из диапазона В7:В1000 при клике на нее, в другую ячейку (А1).
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 20.02.2015, 21:29

Если в диапазоне [B7:B1000] нет об'единённых ячеек, то решить поставленную задачу можно, например, так :

Код:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean)
    If Not Intersect([B7:B1000], Target) Is Nothing Then
       Target.Copy [A1]: Cancel = True
    End If
End Sub
Обратите внимание на то, что событие Worksheet_BeforeDoubleClick возникает после двойного клика правой кнопкой мышки. Если сие действие слишком обременительно, то можно использовать событие Worksheet_SelectionChange, только в этом случае нужно учесть, что выделено может быть более одной ячейки.
Ответить с цитированием
Пользователь сказал cпасибо:
Nasek (20.02.2015)
  (#7 (permalink)) Старый
Nasek Nasek вне форума
Member
 
Сообщений: 12
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 20.02.2015
По умолчанию 20.02.2015, 22:28

Спасибо, pashulka, за быстрый и квалифицированный ответ. Дело в том, что к указанному диапазону прикреплен вызов пользовательской формы, поэтому я просто вставил в код активации формы приведенную Вами строчку (Target.Copy [A1]: Cancel = True). Все работает корректно при нажатии и левой, и правой клавиши мыши. Я прошу прощения за свою "дремучесть", но не могли бы Вы мне подсказать, какая функция в диалоговом окне Prorerties отвечает за перенос текста по словам (сейчас у меня длинная строка уходит за пределы "окна" формы. Очень Вам признателен за помощь.
Ответить с цитированием
  (#8 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 20.02.2015, 23:04

1) Cancel = True нужна только для события Worksheet_BeforeDoubleClick

2) Что касается переноса текста по словам, применительно к UserForm, то непонятно где и как Вы выводите текст если в заголовке, то там переноса нет, если же в каком-нибудь текстовом поле (TextBox), то у этого элемента управления есть свойство MultiLine = True
Ответить с цитированием
  (#9 (permalink)) Старый
Nasek Nasek вне форума
Member
 
Сообщений: 12
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 20.02.2015
По умолчанию 20.02.2015, 23:33

1) и тем не менее, все пока работает корректно. Был правда, один сбой - переопределилось значение в одной ячейке. Я поправил, больше нарушений не замечал. Если обнаружу - напишу Вам.

2) Тексты располагаются в ListBox, среди свойств я, к сожалению, MultiLine не обнаружил. Возможно, оно не было установлено?
Ответить с цитированием
  (#10 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 20.02.2015, 23:48

1) Скажите, а для чего здесь "нужно" присваивать необ'явленной переменной Cancel значение True ?

Код:
Private Sub UserForm_Activate() 'UserForm_Initialize()
    Cancel = True 'просто мусор
End Sub
2) У ListBox такого свойства нет.
Ответить с цитированием
  (#11 (permalink)) Старый
Nasek Nasek вне форума
Member
 
Сообщений: 12
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 20.02.2015
По умолчанию 21.02.2015, 02:42

1) вероятно, так оно и есть. Я просто скопировал то, что мне прислали. Не обижайтесь на мою серость. Поверьте, я все-таки обладаю какими-то другими знаниями и навыками.
2) буду переделывать текстовые поля на TextBox.
Ответить с цитированием
  (#12 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 21.02.2015, 08:19

1) Если ширина ListBox не позволяет увидеть весь текст, то можно просто создать один TextBox и "связать" его со списком, например, так :

Код:
Private Sub ListBox1_Click()
    TextBox1.Value = ListBox1.Value 'TextBox1 = ListBox1
End Sub
2) TextBox это и есть текстовое поле
Ответить с цитированием
Пользователь сказал cпасибо:
Nasek (24.02.2015)
Ads
  (#13 (permalink)) Старый
Nasek Nasek вне форума
Member
 
Сообщений: 12
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 20.02.2015
По умолчанию 25.02.2015, 19:07

Здравствуйте, pashulka!
Помогите, пожалуйста, решить такую проблему.
В графе "Статус предложения" к ячейкам H7:H1000 прикреплена пользовательская форма (). Однако она должна вызываться при щелчке по тем ячейкам, где имеется подпись "сделано".
Основная же проблема состоит в следующем: как перенести данные из ячеек строки, по ячейке которой был произведен щелчок мыши, в соответствующие поля формы. Покажите, пожалуйста, хотя бы на примере номера записи (ячейки A7:A1000), а остальное я попытаюсь сделать по аналогии самостоятельно.
Ответить с цитированием
  (#14 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 25.02.2015, 21:23

Честно говоря, мне неизвестно, что Вы вкладываете в термин "подпись", но если это значение/текст ячейки, то :

vb Код:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Not Intersect([H1:H1000], Target) Is Nothing Then
       If LCase(Trim(Target)) = "сделано" Then
          Dim iRow&: iRow = Target.Row
          With UserForm1
               .TextBox1 = Cells(iRow, "A")
               .TextBox2 = Cells(iRow, "B")
               .TextBox3 = Cells(iRow, "C")
               .Show
          End With
          Cancel = True
       End If
    End If
End Sub

Или так :

vb Код:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Not Intersect([H1:H1000], Target) Is Nothing Then
       If LCase(Target) Like "*сделано*" Then
          With UserForm1
               .TextBox1 = Target(1, -6)
               .TextBox2 = Target(1, -5)
               .TextBox3 = Target(1, -4)
               .Show
          End With
          Cancel = True
       End If
    End If
End Sub

Если же "подпись" - это примечание/комментарий, то вместо Trim(Target) можно использовать Trim(Target.NoteText)
Ответить с цитированием
  (#15 (permalink)) Старый
Nasek Nasek вне форума
Member
 
Сообщений: 12
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 20.02.2015
По умолчанию 25.02.2015, 22:46

Спасибо большое! Вы просто маг и волшебник.
Под подписью я имел в виду содержимое ячейки.
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Событие на клике поля Nenado Delphi 3 04.03.2012 21:14
Задача о клике графа Serena Вопросы начинающих программистов 0 07.06.2011 19:06
Копировать строку в другую книгу Gvaridos Visual Basic 1 16.11.2010 19:12
Не открываются логические диски при двойном клике. Fargus Техническая поддержка 14 28.11.2008 12:06
Контекстное меню, при правом клике по форме. diment Visual Basic 22 18.12.2006 16:27
Не работают макросы. Ссылается на другую книгу Митяй Visual Basic 4 02.02.2006 20:50
Как скопировать файл из одной директории в другую Genadi C++ Builder 6 08.11.2005 07:48
Access как при клике на объект получать фокус imported_Алексей_М Другие СУБД 2 29.08.2005 17:00
Как скрыть один объект при клике на второй el-niko DHTML, JavaScript, VBScript 1 24.04.2005 23:26
Выполнение кода при клике на bitmap DmitriyG Visual C++ 5 14.10.2004 17:48
Как в Opere при клике на яч.таблицы сменить background img Anonymous DHTML, JavaScript, VBScript 0 30.11.2003 17:47
Как скопировать одну строку в другую Trian C++ Builder 6 20.05.2003 12:32



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов