Доброго времени суток, Посетитель!
|
|
|
|
|
|
|
|
|
вид форума:
|
|
|
|
| Здравствуйте все! С Новым Годом!
Появились два примитивных вопроса.
1. База данных работает из-под Access 2003, с использованием в некоторых случаях средств VBA. Появилась необходимость выполнить во время работы базы программными средствами следующие операции с буфером обмена Office: а) очистить содержимое буфера обмена; б) занести в буфер обмена содержимое некоего поля некоторой формы, для определенности форма FFF, поле PPP, текстовое; к моменту выполнения соответствующего программного кода форма открыта, но не обязательно активна. В книгах я ничего на этот счет не нашел.
2. Общеизвестно, что при работе с Word для открытия файлов не .doc (.txt, .rtf) надо в настройках указывать подтверждение преобразования при открытии; если такую настройку не сделать, то открывается ахинея (а в Word 2007 такая настройка устанавливается автоматически), при этом на подтверждение преобразования оператором тратится некоторое время. Вопрос: можно ли сделать так (если нужно, программными средствами, и тогда — какими?), чтобы при открытии в Word файлов (хотя бы .rtf) Word сам распознавал необходимость преобразования и производил такое преобразование, но не требовал ответа оператора и соответственно затрат его времени?
Если кто знает, подскажите как сделать или хотя бы где прочесть. Заранее признателен. | |
|
| |
|
|
|
| почитайте, пока есть время.
Сначала заголовки, а затем содержимое
http://hiprog.com/index.php?option=com_search&Itemid=5&searchword=%E1%F3%F4%E5%F0&submit=%CF%EE%E8%F1%EA&searchphrase=any&ordering=newest | |
|
| |
|
|
|
| Здравствуйте все!
Спасибо всем, кто откликнулся, но пока нет положительныъ результатов.
1. Коллега час навел на тексты А. Пешкина, я взял их и попробовал. Получается так: буфер обмена очищается, но нужное значение в него не заносится. Ниже привожу текст скрипта, который это делает. Может быть, дело в том, что у Пешкина работа в Юникоде, а у меня все данные в ANSI; а тогда что нужно поменять?
2. Коллега _sian_ посоветовал использовать макрорекордер. Сделано следующее: использована стандартная схема создания макроса через Начать запись, открыт файл в формате RTF, подтверждено преобразование при открытии, закрыт файл, Остановить запись макроса. В результате получился пустой макрос. Для надежности сделано два варианта: запись нового макроса в Word и в Excel — с одним и тем же результатом. При этом в Word флажок подтверждения преобразования стоит. То есть (пока что) макрорекордер не ловит преобразование файла.
Если кто может, подскажите, что тут еще надо сделать.
Option Compare Database
' Функции для работы с буфером обмена Office.
Public Declare Function GlobalUnlock Lib "Kernel32" (ByVal hMem As Long) As Long
Public Declare Function GlobalLock Lib "Kernel32" (ByVal hMem As Long) As Long
Public Declare Function GlobalAlloc Lib "Kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Public Declare Function OpenClipboard Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Function CloseClipboard Lib "user32" () As Long
Public Declare Function EmptyClipboard Lib "user32" () As Long
Public Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
'Public Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
'Public Declare Function GlobalSize Lib "Kernel32" (ByVal hMem As Long) As Long
Public Declare Function lstrcpy Lib "Kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
Public Const GHND = &H42
Public Const CF_TEXT = 1
'Public Const MAXSIZE = 4096
Public Function fnCLPSetData(sS As String) As String
Dim hGlobalMemory As Long, lpGlobalMemory As Long
Dim hClipMemory As Long, X As Long
' Allocate moveable global memory.
' -------------------------------------------
hGlobalMemory = GlobalAlloc(GHND, Len(sS) + 1)
' Lock the block to get a far pointer to this memory.
lpGlobalMemory = GlobalLock(hGlobalMemory)
' Copy the string to this global memory.
lpGlobalMemory = lstrcpy(lpGlobalMemory, sS)
' Unlock the memory.
If GlobalUnlock(hGlobalMemory) = 0 Then
' Call fnMsgBoxErrOK("fnCLPSetData" + vbCrLf + "Could Not unlock memory location. Copy aborted.", "Ошибка")
fnCLPSetData = ""
GoTo l_End
End If 'GlobalUnlock(hGlobalMemory) = 0
' Open the Clipboard to copy data to.
If OpenClipboard(0&) = 0 Then
' Call fnMsgBoxErrOK("fnCLPSetData" + vbCrLf + "Could Not Open the Clipboard. Copy aborted.", "Ошибка")
fnCLPSetData = ""
Exit Function
End If 'OpenClipboard(0&) = 0
' Clear the Clipboard.
X = EmptyClipboard()
' Copy the data to the Clipboard.
hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)
l_End:
If CloseClipboard() = 0 Then
' Call fnMsgBoxErrOK("fnCLPSetData" + vbCrLf + "Could Not close Clipboard.", "Ошибка")
End If 'CloseClipboard() = 0
fnCLPSetData = sS
End Function
. . .
' Это обращение к занесению данных в буфер
fnCLPSetData (strDS)
. . .
' Это вставка из буфера его содержимого в нужное место
DoCmd.RunCommand acCmdPaste | |
|
| |
|
|
|
| вот очистка пока
'Поместить в раздел описаний модуля:
Declare Function EmptyClipboard Lib "User32" () As Long
'собственно очистка:
Public Sub ClearClipBoard()
'Очистка Clipboard.
Dim X As Long
X = EmptyClipboard()
End Sub
|
Команда вставить
DoCmd.DoMenuItem acFormBar, acEditMenu, acPaste, , acMenuVer70
А по поводу поместить в буфер - на до видимо что-то скопировать - как Вы считаете???
например
DoCmd.RunCommand acCmdCopy | |
|
| |
|
11 Кб. |
|
| А ваще вот посмотри
Может сгодится?????
http://am.rusimport.ru/MsAccess/f2.aspx?id=20288
http://www.relib.com/forums/Topic912761-20-1.aspx#bm912805 | |
|
| |
|
11 Кб. |
|
| А как чистить етот буфер????
Может так сгодится??? | |
|
| |
|
14 Кб. |
|
| вот подрисовал, но с API чё-та не хочет работать.... ... | |
|
| |
|
|
|
| Уважаемый коллега час!
Спасибо за внимание и помощь.
Сообщаю, что после публикования текста на основе предложенной Вами ссылки на Пешкина я еще поотлаживал и добился нужного результата — все, что нужно, заносится сначала в буфер (с очисткой буфера), а потом куда надо вставляется. Если интересно, готов представить исправленный текст скрипта.
Вставка с самого начала работала у меня правильно, через
DoCmd.RunCommand acCmdPaste
Что же касается
DoCmd.RunCommand acCmdCopy
то Вы совершенно правы — были бы правы, и я тоже сначала так хотел работать, но штука в том, что копируется при этом то, что предварительно выделяется. Но программных средств выделения (в VBA Access) я не нашел, вернее, выделения чего надо, например, можно выделить форму целиком, а надо отдельное поле формы. Вот в VBA Excel — сколько угодно, я сам не раз это делал, и успешно.
Пришла в голову еще одна мыслишка: может быть, можно как-то выделить рабочую переменную (типа String) — это тем более было бы хорошо, что в некоторых случаях, ради которых вообще все затеяно, копируемый набор символов формируется определенным образом из нескольких полей формы (или, что тоже самое, из нескольких полей таблиц); тогда то, что надо копировать, формируем в рабочую переменную, затем ее выделяем, затем Copy и затем Paste — и вопрос был бы закрыт. | |
|
| |
|
|
|
|
| Это скрипт, о котором я сообщал; он делает, что мне нужно
Option Compare Database
Public Const GHND = &H42
Public Const CF_TEXT = 1
' Функции для работы с буфером обмена Office.
Public Declare Function GlobalUnlock Lib "Kernel32" (ByVal hMem As Long) As Long
Public Declare Function GlobalLock Lib "Kernel32" (ByVal hMem As Long) As Long
Public Declare Function GlobalAlloc Lib "Kernel32" (ByVal wFlags As Long, _
ByVal dwBytes As Long) As Long
Public Declare Function OpenClipboard Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Function CloseClipboard Lib "user32" () As Long
Public Declare Function EmptyClipboard Lib "user32" () As Long
Public Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, _
ByVal hMem As Long) As Long
Public Declare Function lstrcpy Lib "Kernel32" (ByVal lpString1 As Any, _
ByVal lpString2 As Any) As Long
Public Function fnCLPSetData(sS As String) As String
Dim hGlobalMemory As Long, lpGlobalMemory As Long
Dim hClipMemory As Long, X As Long
' Allocate moveable global memory.
' -------------------------------------------
hGlobalMemory = GlobalAlloc(GHND, Len(sS) + 1)
' Lock the block to get a far pointer to this memory.
lpGlobalMemory = GlobalLock(hGlobalMemory)
' Copy the string to this global memory.
lpGlobalMemory = lstrcpy(lpGlobalMemory, sS)
' Unlock the memory.
If GlobalUnlock(hGlobalMemory) <> 0 Then
' Call fnMsgBoxErrOK("fnCLPSetData" + vbCrLf + _
"Could Not unlock memory location. Copy aborted.", "Ошибка")
fnCLPSetData = ""
GoTo l_End
End If 'GlobalUnlock(hGlobalMemory) <> 0
' Open the Clipboard to copy data to.
If OpenClipboard(0&) = 0 Then
' Call fnMsgBoxErrOK("fnCLPSetData" + vbCrLf + _
"Could Not Open the Clipboard. Copy aborted.", "Ошибка")
fnCLPSetData = ""
Exit Function
End If 'OpenClipboard(0&) = 0
' Clear the Clipboard.
X = EmptyClipboard()
' Copy the data to the Clipboard.
hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)
l_End:
If CloseClipboard() = 0 Then
' Call fnMsgBoxErrOK("fnCLPSetData" + vbCrLf + _
"Could Not close Clipboard.", "Ошибка")
End If 'CloseClipboard() = 0
fnCLPSetData = sS
End Function
. . .
' Это обращение к занесению данных в буфер
fnCLPSetData (strDS)
. . .
' Это вставка из буфера его содержимого в нужное место
DoCmd.RunCommand acCmdPaste | |
|
| |
|
HiProg.com - Технологии программирования
|