dostęp do pola tekstowego excela

0

Witam wszystkich

Wiadomo, że w excelu poprzez menu Rysowanie można wstawiać do arkusza pola tekstowe lub autokształty.
Utworzyłem program, który z komórek cells czyta dane i przenosi do tabeli .abs.
Może także przenosić dane z tabeli .abs do z góry ustalonej komórki arkusza excela. Realizuję to za pomocą procedur oleVariant opisanych w forum.
Pytanie brzmi: Czy w podobny sposób można mieć dostęp do pola tekstowego lub autokształtu (np strzałki)
znajdujących sie w konkretnym arkuszu?
Czy można programowo z poziomu delphi7 zmieniać położenie tych elementów?

0

Obrabiałem pola tekstowe w PowerPoincie, ale mysle ze w Excelu bedzie identycznie (względnie podobnie :-)).
Najpierw trzeba znać consty typów obiektów

  'Type 1
            Case msoAutoShape
                it = "an AutoShape. Type : " & .Type

            'Type 2
            Case msoCallout
                it = "a Callout. Type : " & .Type

            'Type 3
            Case msoChart
                it = "a Chart. Type : " & .Type

            'Type 4
            Case msoComment
                it = "a Comment. Type : " & .Type

            'Type 5
            Case msoFreeform
                it = "a Freeform. Type : " & .Type

            'Type 6
            Case msoGroup
                it = "a Group. Type : " & .Type

            ' If it's a group them iterate thru
            ' the items and list them

                it = it & vbCrLf & "Comprised of..."
                For Ctr = 1 To .GroupItems.Count
                    it = it & vbCrLf & _
                        .GroupItems(Ctr).Name & _
                        ". Type:" & .GroupItems(Ctr).Type
                Next Ctr

            'Type 7
            Case msoEmbeddedOLEObject
                it = "an Embedded OLE Object. Type : " & .Type

            'Type 8
            Case msoFormControl
                it = "a Form Control. Type : " & .Type

            'Type 9
            Case msoLine
                it = "a Line. Type : " & .Type

            'Type 10
            Case msoLinkedOLEObject
                it = "a Linked OLE Object. Type : " & .Type
                With .LinkFormat
                    it = it & vbCrLf & "My Source: " & _
                        .SourceFullName
                End With

            'Type 11
            Case msoLinkedPicture
                it = "a Linked Picture. Type : " & .Type
                With .LinkFormat
                    it = it & vbCrLf & "My Source: " & _
                        .SourceFullName
                End With

            'Type 12
            Case msoOLEControlObject
                it = "an OLE Control Object. Type : " & .Type

            'Type 13
            Case msoPicture
                it = "a embedded picture. Type : " & .Type

            'Type 14
            Case msoPlaceholder
                it = "a text placeholder (title or regular text--" & _
                     "not a standard textbox) object." & _
                     "Type : " & .Type

            'Type 15
            Case msoTextEffect
                it = "a WordArt (Text Effect). Type : " & .Type

            'Type 16
            Case msoMedia
                it = "a Media object .. sound, etc. Type : " & .Type
                With .LinkFormat
                    it = it & vbCrLf & " My Source: " & _
                    .SourceFullName
                End With

            'Type 17
            Case msoTextBox
                it = "a Text Box."

            'Type 18 = msoScriptAnchor, not defined in PPT pre-2000 so we use the numeric value
            'Case msoScriptAnchor
            Case 18
                it = " a ScriptAnchor. Type : " & .Type

            'Type 19 = msoTable, not defined in PPT pre-2000 so we use the numeric value
            'Case msoTable
            Case 19
                it = " a Table. Type : " & .Type

            'Type 19 = msoCanvas, not defined in PPT pre-2000 so we use the numeric value
            'Case msoCanvas
            Case 20
                it = " a Canvas. Type : " & .Type

            'Type 21 = msoDiagram, not defined in PPT pre-2000 so we use the numeric value
            'Case msoDiagram
            Case 22
                it = " a Diagram. Type : " & .Type

            'Type 22 = msoInk, not defined in PPT pre-2000 so we use the numeric value
            'Case msoInk
            Case 22
                it = " an Ink shape. Type : " & .Type

            'Type 23 = msoInkComment, not defined in PPT pre-2000 so we use the numeric value
            'Case msoInkComment
            Case 23
                it = " an InkComment. Type : " & .Type

W PPT jest tak:

    
  CountShape := PPT.ActivePresentation.Slides.Item(IndexSlide).Shapes.Count;
  for I := 1 to CountShape do
  begin
    TypShape := PPT.ActivePresentation.Slides.Item(IndexSlide).Shapes.Item(I).Type;
    if(TypShape in [1,14,17]) then //textbox i inne typu tekstowego
    Text := PPT.ActivePresentation.Slides.Item(IndexSlide).Shapes.Item(I).TextFrame.TextRange;
  end;

Po lekkiej modyfikacji z ActivePresentation.Slides na WorkBook[1].WorkSheets[X] może zadziała bez poprawek.
Zawsze można otworzyć makro w Excelu i tam masz InteliSense żeby sprawdzić funkcje

0

Dzięki za szybką poradę.

Jednak chyba nie umiem dostosować tej porady do delphi7.
Składnia deklaracji obiektów constans jest chyba nie taka,
ponadto po wpisaniu po WorkSheet[x].shape['pole tekstowe 1'].select;
otrzymuje błąd metody Ole.

Problem wpisu danych do pola tekstowego rozwiązałem w samym excelu
za pomocą pewnej sztuczki.
Teraz bardziej mnie interesuje metoda przemieszczania obiektów i autokształtów
po arkuszu excela za pomocą delphi7

pozdrawiam Ryszard.

0

Leniwy jesteś... Tak jak mowilem, przerobka na WorkBooks wystarczylo:

procedure TForm1.Button1Click(Sender: TObject);
var
  Excel: OleVariant;
  I, ShapeCount: Integer;
begin
  Excel := CreateOleObject('Excel.Application');
  Excel.DisplayAlerts := False;
  Excel.WorkBooks.Open('C:\Excel.xls');
  ShapeCount := Excel.WorkBooks[1].WorkSheets[1].Shapes.Count;

  for I := 1 to ShapeCount do
  begin
    Excel.WorkBooks[1].WorkSheets[1].Shapes.Item(I).Left := 300;
  end;
  
  Excel.Save;
  Excel.Quit;
  Excel := UnAssigned;

end;

Jesli chcesz przemiescic tylko jakies typy obiektow, to musisz sprawdzic je tak jak pisalem w poprzednim poscie.
Moze constansy sa inne.. Sprawdz sam, walnij przerozne obiekty do arkusza a w petli dasz ShowMessage(IntToStr(Excel.WorkBooks[1].WorkSheets[1].Shapes.Item(I).Type))
Wtedy otrzymasz dla jakich numerow typow, chcesz zmienic polozenie czy tam tekst.
Masz gotowe 'dobranie' sie do obiektu, wiec i tamten problem z tekstem mozesz zrobic tak jak sie nalezy bez sztuczek...

0

Co za expres na tym forum nie spodziewałem sie tak szybkiej odpowiedzi.
Przemieszczanie chodzi jak należy i o to mi chodziło - dzięki serdeczne za pomoc.

Z dostępem do wpisu tekstu lub zmiany koloru tła pola tekstowego nadal mam problem.
Metoda text oraz Brush nie działają.
Myślę że brak deklaracji const ów jest przyczyną.
Nie wiem jak sie za to zabrać bo brak mi podstaw teoretycznych.
Uczyłem sie programowania analizując gotowe procedury.
Podobnego problemu nigdzie nie znalazłem ani na forum, ani poprzez google.
Czyżby nikt sie tym nie zajmował? Może to tak proste że tylko ja zadaję głupie pytania?
Jeśli można liczyć na pomoc to PROSZĘ.

Pozdrawiam Ryszard - samouk :-(

0
procedure TForm1.Button1Click(Sender: TObject);
const
  TextBox = [17];
var
  Excel: OleVariant;
  I, ShapeCount, LType: Integer;
begin
  Excel := CreateOleObject('Excel.Application');
  Excel.DisplayAlerts := False;
  Excel.WorkBooks.Open('C:\Excel.xls');
  ShapeCount := Excel.WorkBooks[1].WorkSheets[1].Shapes.Count;

  for I := 1 to ShapeCount do
  begin
    LType := Excel.WorkBooks[1].WorkSheets[1].Shapes.Item(I).Type;
    if LType in TextBox then
    begin
     Excel.WorkBooks[1].WorkSheets[1].Shapes.Item(I).TextFrame.Characters.Text := 'Moj tekst dla Ciebie';
     Excel.WorkBooks[1].WorkSheets[1].Shapes.Item(I).Fill.ForeColor.SchemeColor := 12;
    end;
  end;

  Excel.Save;
  Excel.Quit;
  Excel := UnAssigned;

end;

Co do koloru to ColorToRGB(clRed) nie chciało działać. Musisz tam wprowadzić indeksy kolorow. Ich numery gdzies sa, albo doswiadczalnie posprawdzać. Ten '12' to niebieski.
Moze zamiast SchemeColor jest inna propercja do wprowadzenia RGB, ale to juz nie chce mi sie sprawdzac. Tamto powinno wystarczyc :-P
Co do Google to był(ale trochę zakopany), niekoniecznie w Delphi, bo tu C# i tym bardziej VBA pasują.

0

Dzięki, Dzięki, Dzięki.
Tego było mi trzeba.
Myślę że temat przyda się także innym
bo stanowi uzupełnienie dostępu do excela.

Pozdrawiam serdecznie.
Ryszard.
:-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1