немного опоздал добавлю, что диапазон нужно не просто очищать, а удалять, ибо остаются подключения добавил еще 1 вариант на Лист2 [vba]
Код
Sub SQLQuery_1() Dim varConn As String Dim varSQL As String
Range("A1").CurrentRegion.Delete xlUp
varConn = "ODBC;DSN=MS Access Database;DriverId=25;DBQ=База данных7.accdb_;DefaultDir=" & ThisWorkbook.Path varSQL = "SELECT Имя, Фамилия, Должность FROM Таблица1"
With ActiveSheet.QueryTables.Add(Connection:=varConn, Destination:=Range("A1")) .CommandText = varSQL .Name = "Query-39008" .Refresh BackgroundQuery:=False End With End Sub
[/vba]
немного опоздал добавлю, что диапазон нужно не просто очищать, а удалять, ибо остаются подключения добавил еще 1 вариант на Лист2 [vba]
Код
Sub SQLQuery_1() Dim varConn As String Dim varSQL As String
Range("A1").CurrentRegion.Delete xlUp
varConn = "ODBC;DSN=MS Access Database;DriverId=25;DBQ=База данных7.accdb_;DefaultDir=" & ThisWorkbook.Path varSQL = "SELECT Имя, Фамилия, Должность FROM Таблица1"
With ActiveSheet.QueryTables.Add(Connection:=varConn, Destination:=Range("A1")) .CommandText = varSQL .Name = "Query-39008" .Refresh BackgroundQuery:=False End With End Sub
Мне показалось, или юкоз наконец-то пофиксил счетчик сообщений в профиле? Сейчас у меня в профиле и вот тут количество сообщений одинаковое, раньше оно отличалось (в профиле было меньше)
Мне показалось, или юкоз наконец-то пофиксил счетчик сообщений в профиле? Сейчас у меня в профиле и вот тут количество сообщений одинаковое, раньше оно отличалось (в профиле было меньше)krosav4ig
если нужно выбирать принтер, я обычно таким кодом пользуюсь [vba]
Код
Sub Print2OtherPrinter() Dim aPrn: aPrn = ActivePrinter If Application.Dialogs(xlDialogPrinterSetup).Show Then _ ActiveWindow.SelectedSheets.PrintOut Copies:=1 ActivePrinter = aPrn End Sub
[/vba]
если нужно выбирать принтер, я обычно таким кодом пользуюсь [vba]
Код
Sub Print2OtherPrinter() Dim aPrn: aPrn = ActivePrinter If Application.Dialogs(xlDialogPrinterSetup).Show Then _ ActiveWindow.SelectedSheets.PrintOut Copies:=1 ActivePrinter = aPrn End Sub
на всякий случай набросал пару вариантов решения, предложенного anvg [vba]
Код
Public Sub ReadXML2() Dim XMLFileName As Variant Dim bool As Boolean: bool = True Dim XmlDom: Set XmlDom = CreateObject("microsoft.xmldom") For Each XMLFileName In Application.GetOpenFilename("XML files,*.xml", , "upload new xml", , True) XmlDom.Load XMLFileName With CreateObject("vbscript.regexp") .Pattern = "([</]{1,2})" & XmlDom.SelectNodes("//group")(0).ParentNode.nodeName & "([^>]*\>)" .Global = True ActiveWorkbook.XmlMaps("package_карта").ImportXml _ IIf(.test(XmlDom.XML), .Replace(XmlDom.XML, "$1package$2"), XmlDom.XML), bool End With bool = False Next Set XmlDom = Nothing With Sheets("xml").ListObjects("Запрос") .Refresh .DataBodyRange.Copy End With With Sheets("Лист1").ListObjects("TBL") .HeaderRowRange(1).Offset([tbl].Rows.Count + _ IIf(.DataBodyRange Is Nothing, 0, 1)). _ PasteSpecial xlPasteValues End With End Sub
[/vba]
[vba]
Код
Public Sub ReadXML2_1() Dim XMLFileName As Variant Dim bool As Boolean: bool = True Dim XmlDom: Set XmlDom = CreateObject("microsoft.xmldom") Dim Elem As Object, newElem As Object, ChildElem As Object For Each XMLFileName In Application.GetOpenFilename("XML files,*.xml", , "upload new xml", , True) XmlDom.Load XMLFileName Set Elem = XmlDom.SelectNodes("//group")(0).ParentNode If Elem.nodeName <> "package" Then Set newElem = XmlDom.createElement("package") For Each ChildElem In Elem.ChildNodes Call newElem.appendChild(ChildElem) Next Call Elem.ParentNode.replaceChild(newElem, Elem) Set Elem = Nothing: Set newElem = Nothing End If ActiveWorkbook.XmlMaps("package_карта").ImportXml XmlDom.XML, bool bool = False Next Set XmlDom = Nothing With Sheets("xml").ListObjects("Запрос") .Refresh .DataBodyRange.Copy End With With Sheets("Лист1").ListObjects("TBL") .HeaderRowRange(1).Offset([tbl].Rows.Count + _ IIf(.DataBodyRange Is Nothing, 0, 1)). _ PasteSpecial xlPasteValues End With End Sub
[/vba]
на всякий случай набросал пару вариантов решения, предложенного anvg [vba]
Код
Public Sub ReadXML2() Dim XMLFileName As Variant Dim bool As Boolean: bool = True Dim XmlDom: Set XmlDom = CreateObject("microsoft.xmldom") For Each XMLFileName In Application.GetOpenFilename("XML files,*.xml", , "upload new xml", , True) XmlDom.Load XMLFileName With CreateObject("vbscript.regexp") .Pattern = "([</]{1,2})" & XmlDom.SelectNodes("//group")(0).ParentNode.nodeName & "([^>]*\>)" .Global = True ActiveWorkbook.XmlMaps("package_карта").ImportXml _ IIf(.test(XmlDom.XML), .Replace(XmlDom.XML, "$1package$2"), XmlDom.XML), bool End With bool = False Next Set XmlDom = Nothing With Sheets("xml").ListObjects("Запрос") .Refresh .DataBodyRange.Copy End With With Sheets("Лист1").ListObjects("TBL") .HeaderRowRange(1).Offset([tbl].Rows.Count + _ IIf(.DataBodyRange Is Nothing, 0, 1)). _ PasteSpecial xlPasteValues End With End Sub
[/vba]
[vba]
Код
Public Sub ReadXML2_1() Dim XMLFileName As Variant Dim bool As Boolean: bool = True Dim XmlDom: Set XmlDom = CreateObject("microsoft.xmldom") Dim Elem As Object, newElem As Object, ChildElem As Object For Each XMLFileName In Application.GetOpenFilename("XML files,*.xml", , "upload new xml", , True) XmlDom.Load XMLFileName Set Elem = XmlDom.SelectNodes("//group")(0).ParentNode If Elem.nodeName <> "package" Then Set newElem = XmlDom.createElement("package") For Each ChildElem In Elem.ChildNodes Call newElem.appendChild(ChildElem) Next Call Elem.ParentNode.replaceChild(newElem, Elem) Set Elem = Nothing: Set newElem = Nothing End If ActiveWorkbook.XmlMaps("package_карта").ImportXml XmlDom.XML, bool bool = False Next Set XmlDom = Nothing With Sheets("xml").ListObjects("Запрос") .Refresh .DataBodyRange.Copy End With With Sheets("Лист1").ListObjects("TBL") .HeaderRowRange(1).Offset([tbl].Rows.Count + _ IIf(.DataBodyRange Is Nothing, 0, 1)). _ PasteSpecial xlPasteValues End With End Sub
anvg, в том то и печалько, что в excel не поддерживается ни замещение, ни anyAttribute, ни Any, ни рекурсии, ни абстрактные элементы, ни смешанное содержимое
anvg, в том то и печалько, что в excel не поддерживается ни замещение, ни anyAttribute, ни Any, ни рекурсии, ни абстрактные элементы, ни смешанное содержимоеkrosav4ig
еще вариант, с использованием Activex объектов Image эти объекты на листах "EUR USD","GBP USD", их можно копировать, включив режим конструктора, после копирования этих объектов или листов с ними нужно выполнить макрос init (Alt+F8>Двойной клик по init). Изображения обновляются из буфера обмена по двойному клику на них
[vba]
Код
Option Explicit Public WithEvents img As MSForms.Image Public self As ClsImg
Private Declare Function OleCreatePictureIndirect Lib "oleaut32" (ByRef lpPictDesc As PicBmp, riid As GUID, ByVal fOwn As Long, ByRef lplpvObj As Any) As Long Private Declare Function CloseClipboard Lib "user32.dll" () As Long Private Declare Function CopyImage Lib "user32.dll" (ByVal handle As Long, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal un2 As Long) As Long Private Declare Function GetClipboardData Lib "user32.dll" (ByVal wFormat As Long) As Long Private Declare Function OpenClipboard Lib "user32.dll" (ByVal hwnd As Long) As Long Private Declare Function IsClipboardFormatAvailable Lib "user32.dll" (ByVal wFormat As Long) As Long
Private Type GUID Data1 As Long Data2 As Integer Data3 As Integer Data4(0 To 7) As Byte End Type Private Type PicBmp Size As Long Type As Long hBmp As Long hPal As Long Reserved As Long End Type
Private Sub Class_Initialize() Set self = Me End Sub
Private Sub img_DblClick(ByVal Cancel As MSForms.ReturnBoolean) PastePictureFromClipboard img End Sub
Private Function GetPicture(ByVal hPic As Long, ByVal PicType As Long) As IPictureDisp Dim p As PicBmp, g As GUID With p .hBmp = hPic .Size = Len(p) .Type = PicType End With With g .Data1 = &H7BF80980 .Data2 = &HBF32 .Data3 = &H101A .Data4(0) = &H8B .Data4(1) = &HBB .Data4(3) = &HAA .Data4(5) = &H30 .Data4(6) = &HC .Data4(7) = &HAB End With OleCreatePictureIndirect p, g, 1, GetPicture End Function
Private Sub PastePictureFromClipboard(ByRef img As Image) OpenClipboard 0 If IsClipboardFormatAvailable(2) Then Set img.Picture = GetPicture(CopyImage(GetClipboardData(2), 0, 0, 0, 0), 1) End If CloseClipboard End Sub
[/vba]
[vba]
Код
Public Sub init() Dim sh As Worksheet, obj As OLEObject, itm As ClsImg If Not col Is Nothing Then For Each itm In col Set itm.self = Nothing Next End If Set col = New Collection For Each sh In Sheets For Each obj In sh.OLEObjects If TypeOf obj.Object Is MSForms.Image Then Set itm = New ClsImg Set itm.img = obj.Object col.Add itm End If Next obj, sh End Sub
[/vba]
еще вариант, с использованием Activex объектов Image эти объекты на листах "EUR USD","GBP USD", их можно копировать, включив режим конструктора, после копирования этих объектов или листов с ними нужно выполнить макрос init (Alt+F8>Двойной клик по init). Изображения обновляются из буфера обмена по двойному клику на них
[vba]
Код
Option Explicit Public WithEvents img As MSForms.Image Public self As ClsImg
Private Declare Function OleCreatePictureIndirect Lib "oleaut32" (ByRef lpPictDesc As PicBmp, riid As GUID, ByVal fOwn As Long, ByRef lplpvObj As Any) As Long Private Declare Function CloseClipboard Lib "user32.dll" () As Long Private Declare Function CopyImage Lib "user32.dll" (ByVal handle As Long, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal un2 As Long) As Long Private Declare Function GetClipboardData Lib "user32.dll" (ByVal wFormat As Long) As Long Private Declare Function OpenClipboard Lib "user32.dll" (ByVal hwnd As Long) As Long Private Declare Function IsClipboardFormatAvailable Lib "user32.dll" (ByVal wFormat As Long) As Long
Private Type GUID Data1 As Long Data2 As Integer Data3 As Integer Data4(0 To 7) As Byte End Type Private Type PicBmp Size As Long Type As Long hBmp As Long hPal As Long Reserved As Long End Type
Private Sub Class_Initialize() Set self = Me End Sub
Private Sub img_DblClick(ByVal Cancel As MSForms.ReturnBoolean) PastePictureFromClipboard img End Sub
Private Function GetPicture(ByVal hPic As Long, ByVal PicType As Long) As IPictureDisp Dim p As PicBmp, g As GUID With p .hBmp = hPic .Size = Len(p) .Type = PicType End With With g .Data1 = &H7BF80980 .Data2 = &HBF32 .Data3 = &H101A .Data4(0) = &H8B .Data4(1) = &HBB .Data4(3) = &HAA .Data4(5) = &H30 .Data4(6) = &HC .Data4(7) = &HAB End With OleCreatePictureIndirect p, g, 1, GetPicture End Function
Private Sub PastePictureFromClipboard(ByRef img As Image) OpenClipboard 0 If IsClipboardFormatAvailable(2) Then Set img.Picture = GetPicture(CopyImage(GetClipboardData(2), 0, 0, 0, 0), 1) End If CloseClipboard End Sub
[/vba]
[vba]
Код
Public Sub init() Dim sh As Worksheet, obj As OLEObject, itm As ClsImg If Not col Is Nothing Then For Each itm In col Set itm.self = Nothing Next End If Set col = New Collection For Each sh In Sheets For Each obj In sh.OLEObjects If TypeOf obj.Object Is MSForms.Image Then Set itm = New ClsImg Set itm.img = obj.Object col.Add itm End If Next obj, sh End Sub
снять защиту все ячейки, которые будут редактироваться (Выделить ячейки>Ctrl+1>Защита>снять галку защищаемая) Рецензирование>Защитить лист, при защите листа снять верхнюю галку
снять защиту все ячейки, которые будут редактироваться (Выделить ячейки>Ctrl+1>Защита>снять галку защищаемая) Рецензирование>Защитить лист, при защите листа снять верхнюю галку