Zugriffsabfrage mit VBA nach Excel exportieren und sekundäres Achsendiagramm erstellen

656
Sebastian Salazar

In MS Access habe ich eine Datenbank. Ich habe Formular mit drei TextBoxen und einer Befehlsschaltfläche.

  • In txttask_plot schreibt der Benutzer Plotid
  • In txttask_from wählt der Benutzer date1 aus
  • In txttask_to wählt der Benutzer date2 aus

Das Diagramm befindet sich in Tabelle 1 mit dem Namen von Diagramm 1. Die Abfrage befindet sich in Tabelle2 mit dem Namen der Abfrage.

In der Befehlsschaltfläche habe ich den folgenden Code, der eine Abfrage nach Excel exportiert und alle Daten in einem XlColumnStacked-Diagramm darstellt.

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 

Von hier aus verwende ich den gesamten Code in Excel.

  • Wie kann ich solchen Code in der MS Access-Befehlsschaltfläche verwenden?
  • Wie kann ich für mein Diagramm auswählen Range("C2:D" & i-1)?
  • Wie füge ich eine sekundäre Y-Achse hinzu?
  • Wie füge ich den Haupttitel hinzu und wie füge ich einen Untertitel unter dem Haupttitel hinzu?

Der zweite Satz von (x, y) -Werten ist (Task, Cost) und hat einen Bereich von> 18.000 bis "n", den ich auf der sekundären Y-Achse haben möchte.

Außerdem muss ich einen Haupttitel oben und einen Zweittitel darunter einfügen

Ich habe diesen Code für Titel

'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 

Diagrammbeschriftungen

'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 

Ich habe das Web schon längere Zeit durchsucht, kann mich aber nicht mit der richtigen Syntax befassen: VBA Excel to VBA Access. Ich muss den gesamten Code über die Befehlsschaltfläche im MS Access-Formular ausführen.

1
Ersetzen Sie einfach die `ActiveSth'-Objekte durch einen expliziten Verweis auf das Excel-Objekt und die Arbeitsmappe. usw., wie Sie es in cmdTransfer_Click () `getan haben, aber hier liegen Sie falsch. Diese Frage gehört zu https://stackoverflow.com. Ich werde sie zum Verschieben kennzeichnen. ComputerVersteher vor 5 Jahren 0
Können Sie mir hier ein Beispiel geben, wie Sie ActiveSth-Objekte durch einen expliziten Verweis auf das Excel-Objekt und die Arbeitsmappe ersetzen können? Ich lerne in VBA zu programmieren. Sebastian Salazar vor 5 Jahren 0
Schauen Sie sich die `xl`-,` wb`und `ws'-Objekte von` cmdTransfer_Click () `an, das ist der Trick. ComputerVersteher vor 5 Jahren 0

1 Antwort auf die Frage

0
ComputerVersteher

Anscheinend war ich falsch und Sie können von außen auf ActiveSth-Objekte verweisen.

Dieser Code benötigt einen Verweis auf Microsoft Excel xy.0 Object Libaryund Microsoft Office xy.0 Object Libaryin "VBA-Editor -> Tools -> Verweise" oder definiert explizit das Excel-Enum (z. B. 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 

Versuchen Sie dies, nicht getestet, nur ein kurzer Hack, vielleicht ist ein Ende damit, usw. fehlen.

ComputerVersteher Ich schätze deine Antwort sehr. Zuerst habe ich den Code getestet: Sebastian Salazar vor 5 Jahren 0
ComputerVersteher. Ich schätze Ihre Antwort wirklich sehr. Zuerst habe ich den Code für den Haupttitel getestet und jedes Mal, wenn in dieser Zeile ERROR 1004 angezeigt wird: .ChartTitle.Text = Range ("B1"). Value & "" & Range ("B2"). Value & "" & Bereich ("E1"). Wert Ich denke, ERROR tritt auf, weil sich solche Bereiche im Blatt "qry_task" befinden. Ich weiß nicht, wie ich solche Bereiche auf "qry_task" Sheet verweisen kann. Können Sie mir bitte sagen, wie Sie den Fehler 1004 beheben können? Sebastian Salazar vor 5 Jahren 0
@SebastianSalazar Entschuldigt das (und das fehlende Enum). Siehe aktualisierte Antwort. ComputerVersteher vor 5 Jahren 0