Экспорт запроса Access в Excel с использованием VBA и создание диаграммы вторичной оси

522
Sebastian Salazar

В MS Access у меня есть база данных. У меня есть форма с тремя текстовыми полями и одной командной кнопкой.

  • В txttask_plot пользователь пишет Plotid
  • В txttask_from пользователь выбирает date1
  • В txttask_to пользователь выбирает date2

Диаграмма находится на Листе 1 с названием диаграммы 1. Запрос находится на листе 2 с именем запроса.

В кнопке Command у меня есть следующий код, который экспортирует запрос в Excel и отображает все данные на графике xlColumnStacked.

Sub cmdTransfer_Click() Dim sExcelWB As String Dim xl As Object ''Excel.Application Dim wb As Object ''Excel.Workbook Dim ws As Object ''Excel.Worksheet Dim ch As Object ''Excel.Chart Dim myRange As Object  Set xl = CreateObject("excel.application") sExcelWB = "D:\testing2\" & "_qry_task.xls" DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "qry_mb_costo_jorn_tarea", sExcelWB, True Set wb = xl.Workbooks.Open(sExcelWB)  'Sheets are named with the Access query name Set ws = wb.Sheets("qry_task")  Set ch = xl.Charts.Add ch.ChartType = xlColumnClustered  xl.Visible = True xl.UserControl = True End Sub 

Отсюда я использую весь код в Excel.

  • Как я могу использовать такой код в командной кнопке MS Access?
  • Для моего графика, как я могу выбрать Range("C2:D" & i-1)?
  • Как добавить вторичную ось Y?
  • Как добавить основной заголовок и как добавить субтитр ниже основного заголовка?

Второй набор значений (x, y) (задача, стоимость) имеет диапазон от> 18 000 до «n», который я хочу на вторичной оси Y.

Кроме того, мне нужно вставить основной заголовок сверху и дополнительный заголовок внизу

У меня есть этот код для заголовков

'Main Title from sheet "qry_task" in top of the Chart .HasTitle = True .ChartTitle.Text = Range("A1").Value & " " & Range("A2").Value & " " & Range("D1").Value .Axes(xlValue).MajorGridlines.Delete .Axes(xlCategory, xlPrimary).HasTitle = False .Axes(xlValue, xlPrimary).HasTitle = False  'SubTitle below First Title from Sheet qry_task From txtboxes from the Form. (txt_from – txt_to)  'chart_position_upper_left_corner Macro With ActiveSheet.Shapes("Chart 1") .Left = Range("A1").Left .Top = Range("A1").Top End With  ActiveSheet.Shapes("Chart1").IncrementLeft -375.75 ActiveSheet.Shapes("Chart 1").IncrementTop -96 ActiveSheet.Shapes("Chart 1").ScaleWidth 1.3354166667, msoFalse, _ msoScaleFromTopLeft ActiveSheet.Shapes("Chart 1").ScaleHeight 1.3177085156, msoFalse, _ msoScaleFromTopLeft  'insert secundary axis()  ActiveSheet.ChartObjects("Chart 1").Activate ActiveChart.PlotArea.Select ActiveChart.FullSeriesCollection(2).Select ActiveChart.FullSeriesCollection(2).AxisGroup = 2 ActiveChart.FullSeriesCollection(2).Select ActiveChart.FullSeriesCollection(2).ChartType = xlLineMarkers ActiveChart.FullSeriesCollection(1).Select ActiveChart.ChartGroups(1).GapWidth = 69 ActiveChart.FullSeriesCollection(2).Select Application.CommandBars("Format Object").Visible = False ActiveSheet.Shapes("Chart 1").ScaleWidth 1.5180265655, msoFalse, _ msoScaleFromTopLeft 

Ярлыки диаграммы

'Chart labels ActiveSheet.Shapes("Chart 1").ScaleHeight 1.1797101449, msoFalse, _ msoScaleFromTopLeft ActiveChart.FullSeriesCollection(2).Select ActiveChart.ChartGroups(1).GapWidth = 48 ActiveChart.FullSeriesCollection(1).Select ActiveChart.SetElement (msoElementDataLabelShow) ActiveChart.SetElement (msoElementDataLabelInsideBase) ActiveChart.FullSeriesCollection(1).DataLabels.Select  With Selection.Format.TextFrame2.TextRange.Font.Fill .Visible = msoTrue .ForeColor.ObjectThemeColor = msoThemeColorBackground1 .ForeColor.TintAndShade = 0 .ForeColor.Brightness = 0 .Transparency = 0 .Solid End With  'Edit Font Selection.Format.TextFrame2.TextRange.Font.Bold = msoTrue  With Selection.Format.TextFrame2.TextRange.Font .NameComplexScript = "Arial" .NameFarEast = "Arial" .Name = "Arial" End With End Sub 

Я долго искал в Интернете, но не могу понять, какой синтаксис нужен: от VBA Excel к VBA Access. Мне нужно запустить весь код из командной кнопки в форме MS Access.

1
Просто замените объекты ActiveSth явной ссылкой на Excel-объект и рабочую книгу. и т.д., как вы сделали в `cmdTransfer_Click ()`, но вы здесь не правы. Этот вопрос принадлежит https://stackoverflow.com, я отмечу его как перемещенный. ComputerVersteher 6 лет назад 0
Не могли бы вы привести здесь пример того, как заменить объекты ActiveSth явной ссылкой на объект Excel и рабочую книгу? Я учусь программировать в VBA. Sebastian Salazar 6 лет назад 0
Посмотрите на объекты `xl`,` wb` и `ws`` cmdTransfer_Click () `вот и все. ComputerVersteher 6 лет назад 0

1 ответ на вопрос

0
ComputerVersteher

Кажется, я ошибся, и вы можете ссылаться на объекты ActiveSth извне.

Этот код нуждается в ссылке Microsoft Excel xy.0 Object Libaryи Microsoft Office xy.0 Object Libaryв «VBA-Editor -> Tools -> References» или в явном виде определяет перечисления Excel (например, xlLineMarkers)

Sub cmdTransfer_Click() Dim sExcelWB As String Dim xl As Object ''Excel.Application Dim wb As Object ''Excel.Workbook Dim ws As Object ''Excel.Worksheet Dim ch As Object ''Excel.Chart Dim myRange As Object  Set xl = CreateObject("excel.application") sExcelWB = "D:\testing2\" & "_qry_task.xls" DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "qry_task", sExcelWB, True Set wb = xl.Workbooks.Open(sExcelWB)  'Sheets are named with the Access query name Set ws = wb.Sheets("qry_task")  Set ch = xl.Charts.Add ch.ChartType = xlColumnClustered with ch 'Main Title from sheet "qry_task" in top of the Chart .HasTitle = True .ChartTitle.Text = ws.Range("A1").Value & " " & ws.Range("A2").Value & " " & ws.Range("D1").Value .Axes(xlValue).MajorGridlines.Delete .Axes(xlCategory, xlPrimary).HasTitle = False .Axes(xlValue, xlPrimary).HasTitle = False End With 'SubTitle below First Title from Sheet qry_task 'From txtboxes from the Form. '(txt_from – txt_to)  'chart_position_upper_left_corner Macro With wb .ActiveSheet.Shapes("Chart 1") .Left = .Range("A1").Left .Top = .Range("A1").Top   .ActiveSheet.Shapes("Chart1").IncrementLeft -375.75 .ActiveSheet.Shapes("Chart 1").IncrementTop -96 .ActiveSheet.Shapes("Chart 1").ScaleWidth 1.3354166667, msoFalse, _ msoScaleFromTopLeft .ActiveSheet.Shapes("Chart 1").ScaleHeight 1.3177085156, msoFalse, _ msoScaleFromTopLeft  'insert secundary axis()  .ActiveSheet.ChartObjects("Chart 1").Activate .ActiveChart.PlotArea.Select .ActiveChart.FullSeriesCollection(2).Select .ActiveChart.FullSeriesCollection(2).AxisGroup = 2 .ActiveChart.FullSeriesCollection(2).Select .ActiveChart.FullSeriesCollection(2).ChartType = xlLineMarkers .ActiveChart.FullSeriesCollection(1).Select .ActiveChart.ChartGroups(1).GapWidth = 69 .ActiveChart.FullSeriesCollection(2).Select .Application.CommandBars("Format Object").Visible = False .ActiveSheet.Shapes("Chart 1").ScaleWidth 1.5180265655, msoFalse, _ msoScaleFromTopLeft 'Chart labels  'Chart labels .ActiveSheet.Shapes("Chart 1").ScaleHeight 1.1797101449, msoFalse, _ msoScaleFromTopLeft .ActiveChart.FullSeriesCollection(2).Select .ActiveChart.ChartGroups(1).GapWidth = 48 .ActiveChart.FullSeriesCollection(1).Select .ActiveChart.SetElement (msoElementDataLabelShow) .ActiveChart.SetElement (msoElementDataLabelInsideBase)   With wb.ActiveChart.FullSeriesCollection(1).DataLabels.Format.TextFrame2.TextRange.Font.Fill .Visible = msoTrue .ForeColor.ObjectThemeColor = msoThemeColorBackground1 .ForeColor.TintAndShade = 0 .ForeColor.Brightness = 0 .Transparency = 0 .Solid   'Edit Font .Format.TextFrame2.TextRange.Font.Bold = msoTrue  With .Format.TextFrame2.TextRange.Font .NameComplexScript = "Arial" .NameFarEast = "Arial" .Name = "Arial" End With End With End Sub 

Попробуйте это, не проверено, просто быстрый взлом, возможно, какой-то конец и т. Д. Отсутствуют.

ComputerVersteher Я очень ценю ваш ответ. Сначала я проверил код: Sebastian Salazar 6 лет назад 0
ComputerVersteher. Я очень ценю ваш ответ. Во-первых, я протестировал код для основного заголовка, и каждый раз, когда в этой строке отображается ОШИБКА 1004: .ChartTitle.Text = Range ("B1"). Value & "" & Range ("B2"). Value & "" & Range ("E1"). Значение Я думаю, что ОШИБКА происходит, потому что такие диапазоны находятся на листе "qry_task". Я не знаю, как ссылаться на такие диапазоны на лист "qry_task". Подскажите пожалуйста, как исправить такую ​​ОШИБКУ 1004 Sebastian Salazar 6 лет назад 0
@SebastianSalazar К сожалению пропустил это (и отсутствующие перечисления). Смотрите обновленный ответ. ComputerVersteher 6 лет назад 0

Похожие вопросы