Prezados, solicito auxilio para a criação de gráficos através de macros. Estou desenvolvendo o código com auxílio do Chatgpt, pois não sei muito de programação.
Eu queria uma sub que crie um gráfico para mim dependendo da situação que a planilha se encontra, porém estou com alguma dificuldades:
1- o gráfico está sendo inserido com o fundo preto, ja tentei de tudo e não consigo mudar isso;
2- não está inserindo com a legenda visível, também já tentei de várias formas.
3- o tipo do gráfico que está sendo gerado é sempre de barras, não consigo alterar para outro (dispersão, linhas xy, por ex) apesar de ja ter tentado de várias formas.
4- toda vez que rodo o código, está vindo com a mensagem: O objeto não acessível.
Utilização inválida de um objeto. na linha:
oChart = oPlanilha.Charts.addNewByName(chart_name, rec, aAddresses, True, True)
segue a subs abaixo:
Dim rangeX As String
Sub ObterRangesX()
Dim oDoc As Object
Dim oPlanilha As Object
Dim ultimaLinha As Long
Dim i As Long
Dim nomeX As String
Dim resultado As String
' Obtém o documento atual (planilha)
oDoc = ThisComponent
oPlanilha = oDoc.Sheets.getByName("ANÁLISE")
' Obtém o nome dos dados X na linha 10, coluna A
nomeX = oPlanilha.getCellByPosition(0, 10).String
' Obtém a última linha da coluna A
ultimaLinha = oPlanilha.getRows().getCount() - 1
For i = 12 To ultimaLinha
If oPlanilha.getCellByPosition(0, i).String = "" Then
ultimaLinha = i - 1
Exit For
End If
Next i
' Define o intervalo X
rangeX = "A11:A" & (ultimaLinha + 1) ' Intervalo de A13 até A última linha não vazia
' Monta a mensagem com o nome e o intervalo de dados X
resultado = "Nome dos dados X: " & nomeX & Chr(10) & "Range: " & rangeX
' Mostra os dados em uma única mensagem
MsgBox resultado, 64, "Range X Obtido"
End Sub
Dim rangesY() As String
Sub ObterRangesY()
Dim oDoc As Object
Dim oPlanilha As Object
Dim ultimaLinha As Long
Dim i As Long, j As Long
Dim colunasY() As Long
Dim numColunas As Long
Dim contador As Long
Dim resultado As String
' Obtém o documento atual (planilha)
oDoc = ThisComponent
oPlanilha = oDoc.Sheets.getByName("ANÁLISE")
' Obtém a última linha da coluna A
ultimaLinha = oPlanilha.getRows().getCount() - 1
For i = 12 To ultimaLinha
If oPlanilha.getCellByPosition(0, i).String = "" Then
ultimaLinha = i - 1
Exit For
End If
Next i
' Verifica as colunas a partir da coluna E na linha 11
numColunas = oPlanilha.getColumns().getCount() - 1
contador = 0
' Coleta os índices das colunas com dados Y
For j = 4 To numColunas ' Começando da coluna E (índice 4)
If oPlanilha.getCellByPosition(j, 10).String <> "" Then
ReDim Preserve colunasY(contador)
colunasY(contador) = j
contador = contador + 1
End If
Next j
' Inicializa o array de ranges
ReDim rangesY(0 To contador - 1)
' Monta a mensagem com os ranges de dados Y
resultado = "Ranges Y:" & Chr(10)
' Coleta os ranges Y correspondentes
For j = LBound(colunasY) To UBound(colunasY)
Dim nomeY As String
nomeY = oPlanilha.getCellByPosition(colunasY(j), 10).String ' Título da série Y
' Define o intervalo Y
Dim startCell As String
Dim endCell As String
startCell = oPlanilha.getCellByPosition(colunasY(j), 12).getRangeAddress().StartColumn + 1 & _
(12 ) ' Linha 13 (índice 12)
endCell = oPlanilha.getCellByPosition(colunasY(j), ultimaLinha).getRangeAddress().StartColumn + 1 & _
(ultimaLinha + 1)
' Converte os índices para letras de coluna
Dim colunaLetra As String
colunaLetra = Chr(65 + colunasY(j)) ' 65 é o código ASCII para 'A'
rangesY(j) = colunaLetra & (11) & ":" & colunaLetra & (ultimaLinha + 1) ' Ajusta o formato do intervalo
resultado = resultado & "Nome dos dados Y: " & nomeY & " - Range: " & rangesY(j) & Chr(10)
Next j
' Mostra os ranges em uma única mensagem
MsgBox resultado, 64, "Ranges Y Obtidos"
End Sub
Sub CriarGraficoComDados()
Dim oDoc As Object
Dim oPlanilha As Object
Dim oChart As Object
Dim rec As New com.sun.star.awt.Rectangle
Dim chart_name As String
Dim aAddresses() As Variant ’ Usar Variant para o array
' Obtém o documento atual (planilha)
oDoc = ThisComponent
oPlanilha = oDoc.Sheets.getByName("ANÁLISE")
' Define o nome do gráfico
chart_name = oPlanilha.getCellRangeByName("D9").getString()
' Verifica se o gráfico já existe
If oPlanilha.Charts.hasByName(chart_name) Then
MsgBox "O gráfico já existe!", 64, "Erro"
Exit Sub
End If
' Chama as subs para obter as ranges
ObterRangesX() ' Certifique-se de que esta sub preenche rangeX
ObterRangesY() ' Certifique-se de que esta sub preenche rangesY()
' Define a posição e o tamanho do gráfico
With rec
.X = 810
.Y = 6100
.Width = 25000
.Height = 12500
End With
' Inicializa o array de endereços
Dim numSeries As Long
numSeries = UBound(rangesY) - LBound(rangesY) + 1
ReDim aAddresses(numSeries) ' Um para X e os demais para Y
' Adiciona a range X
aAddresses(0) = oPlanilha.getCellRangeByName(rangeX).RangeAddress
' Adiciona as ranges Y
Dim i As Long
For i = LBound(rangesY) To UBound(rangesY)
aAddresses(i + 1) = oPlanilha.getCellRangeByName(rangesY(i)).RangeAddress
Next i
' Cria um novo gráfico com os dados
oChart = oPlanilha.Charts.addNewByName(chart_name, rec, aAddresses, True, True)
' Ajusta o título do gráfico
oChart.Title = "Gráfico com Dados"
' Define o fundo branco
oChart.BackgroundColor = RGB(255, 255, 255) ' Branco
' Define o tipo do gráfico como linha XY
' Alterar o tipo do gráfico
aChartDoc.setDiagram(aDiagram)
' Adiciona a legenda e define como visível
oChart.HasLegend = True
oChart.getLegend().setVisible(True)
MsgBox "Gráfico com dados criado com sucesso!", 64, "Sucesso"
End Sub