» »

VISUAL BASIC - Makro v wordu - prenos podatkov iz tabel v excel

VISUAL BASIC - Makro v wordu - prenos podatkov iz tabel v excel

DonMatejo ::

Pozdravljeni!

Jst sm seveda začetnik in imam en problemček. Imam recimo 100 strani dolg wordov dokument (.doc), ki vsebuje nebroj tabel, poleg texta. Zdj tabele so načeloma razdeljene v dva stolpca pa imajo variabilno št. vrstic. Zdj te tabele moram prekopirati v excel in ker nekaj znanja (bolj osnove) visual basica imam, sem se odločil, da se s problemom spopadem tako, da naredim makro, ki bo to delal. Seveda pa sem se srečal z nekaj ovirami, največja se mi zdi to, da ne vem, kako bi kakšno stvar poiskal na spletu (recimo stvar znam obrazložiti, ampak se ta skriva pod neko drugo besedo, zato jo brskalniki običajno ne najdejo).
Torej, iz prvega stoplca moram izpisati String za Stringom, ki so eden pod drugim, ločeni z ENTER tipko, v drugem stolpcu pa moram izpisati vse od druge vrstice, ne prve, ampak vse ostale.

1. Do sedaj mi je uspelo odpreti nov excelov dokument, ter prekopirati posamezno tabelo vanj, s tem, da sem prekopiral celotno tabelo. Naredil sem tudi FOR zanko za vse tabele, vendar zaradi "preobremenjenosti" javlja napako in ne izvede operacije do konca, kar pomeni dodatno težavo. Rešitev je v tem, da na vsakih nekaj (recimo 100) vrstic excel shrani podatke, zapre dokument, nato pa ga ponovno odpre.

Primer:
oExcel.SaveAs ("\test2.xls")
stevec = stevec + 1
...
For stevec Mod 100 = 0
oExcel.Close (autosave = true)
Set oExcel = Nothing
Set oExcel = Application.Workbooks.Open("c:\test2.xls")
Next
...

Kako zamenjati zadnjo vrstico, da bo marko deloval? enostavno mi vedno javi napako, da ta zadnji skupek kode ne deluje pravilno.

2. Ja vem, kdor bo tole govoril, bo počasi začel računati računalniške ure, pa vseeno, še par vprašanj, ki so vam, verjetno jasne kot beli dan, meni pa pač ŠE ne. Torej, ko recimo napišem kodo, ki prikaže tabelo v excel, nato pa jo poženem v FOR zanki, da bi pridobil več tabel, mi prve vrstice vztrajno prepisuje z novimi podatki. Kako ga prepričati, da gre na naslednjo prosto vrstico. Sedaj imam v do while tole:

...
Rows = Rows + 1
loop
Cells = Cells + 1
loop
...

No, to ne deluje, ker se programčić spet zbuni, da mu ni všeč sploh in da on pa že ne bo delal tako. Smešno, deluje za eno samo tabelo, ko pa se ponovi v FOR zanki, ki preskoči tabelo, pa ni nič od njega, dobim le prazen dokument. Kako ga torej prepričati, da bo ob naslednji ponovitvi while zank skočil v naslednjo prazno tabelo?

3. No, ta je pa mogoče lažja, vsaj jst sem že vedel odgovor, pa sem ga pozabil. Kako recimo v stringu z n-imi znaki izbereš prve tri? recimo imamo stringe 012abc456, 012abc457, 011abc456... Kako napisati kodo, da bosta izbrana samo pravilna 012 stringa, ostali pa bodo izločen? To je to, ko recimo enostavno ne vem, kako bi opisal key word v iskalnik. Mislil sem enostvno z IF stavkom.

4. Evo, še tale, pa vam dam mir za nocoj hehe, res upam, da me ne boste poslali delat tutorialov, ker sem sit tistih fitness centrov pa prodaje sveč pa ostalih neuporabnih stvari, ampak bi si rad poenostavil c/p metodo, enkrat za vselej. Kako napišeš ukaz, da v excel v recimo Row = 1, Colls = 2 prepiše vse iz recimo worda Row = 1, Colls = 2 s tem, da izpusti prvo vrstico. Prve vrstice nočem, vse ostale pa. Kakšen je ukaz za to? enako velja za recimo to, da imam v enem polju več teh besed, ki bi jih rad dal vsak v svojo celico v excelu, ločene pa so z EnTER tipko (torej vsaka v novi, svoji vrstici, a v istem polju.

5. kaj pomeni ^p ?

p.s.: če je kdo že delal kaj podobnega, je več kot dobrodošlo, da v primeru, da je voljan svojo rešitev deliti, da jo objavi tu, ali pa preko ZS, tudi na mail donmatejo_na__gmail_com.


Pa še to, RES se od srca zahvaljujem tistemu, ki si bo vzel čas, pa napisal tisto, kar ve, da mi lahko kakorkoli pripomore. Tisti ste res vredi dečki. Hvala od srca za kakršen koli odgovor.

LP, Matej

DonMatejo ::

okej, zadeva se razvija... torej, koda je sledeča..


____
no evo, poanta vsega skupi je v tem, da mi zdj izpiše vse vnose, pri tem pa pregleda vrstico za vrstico (celico za celico).

Imam le še en problem, kako pridem do tega, da mi v excel ne bo prepisal samo prve vrstice vsake celice. Primer celice, v kateri so tri vrstice znotraj.
____
ABC123
ABC124
ABC125
____

izpiše mi samo ABC123 (v kolikor so ločeni z ENTER), kako dobiti vse tri izpise? Lahko tudi v kakšnem drugem programskem jeziku. Hvala vam...

DonMatejo ::

'Matej Meglič @ 2009
Sub Excel()
Dim oExcel As Object 'Excel.Application
Dim oBook As Object 'Excel.Workbook
Dim oSht As Object 'Excel.Worksheet
Dim oTbl As Table
Dim oSelect As Selection
Dim lCols As Long
Dim lRows As Long
Dim sValue As String
 

Set oExcel = CreateObject("Excel.Application")
Set oBook = oExcel.Workbooks.Add
Set oSht = oBook.Sheets.Add
oExcel.Visible = True

Dim n As Integer
Dim x As Integer
x = 1

Dim tTable As Table
         For Each tTable In ActiveDocument.Tables
         n = 1
         With tTable
         Do While n <= .Rows.Count
         tTable.Rows(n).Select
                        
            If InStr(1, .Cell(1, 1), "ABC", vbTextCompare) = 1 Then
               Set oTbl = Selection.Tables(1)
               Set oSelect = Selection
            
        lRows = 1
        With oTbl
        Do While lRows <= .Rows.Count
        lCols = 1
        Do While lCols <= .Columns.Count
        oTbl.Cell(lRows, lCols).Select
        sValue = Selection.Text
        sValue = Left(sValue, InStr(sValue, Chr(13)) - 1)
        oSht.Cells(x, lCols).Value = sValue
        lCols = lCols + 1
        Loop
        lRows = lRows + 1
        x = x + 1
        Loop
        End With
        End If
        n = n + 1
        Loop
        End With

      Next

Set oSelect = Nothing
Set oTbl = Nothing
Set oSht = Nothing
Set oBook = Nothing
Set oExcel = Nothing

End Sub


A res nima noben pojma, kako bi rešili zadevo?

Zgodovina sprememb…

FlashM ::

Evo, tole je sicer na hitr napisano v Visual Basic 2008, ampak kolikor sem na hitr preveru stvar dela:
Potrebno je dodat COM referenco Microsoft Word 11.0 Object Library!!!


Imports System
Imports System.Windows.Forms
Imports Microsoft.Office.Interop.Word

Public Class Form1

Private Sub m_bt_start_read_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles m_bt_start_read.Click

Dim word_app As New Microsoft.Office.Interop.Word.Application()
word_app.Visible = True

Dim obj As Object = System.Reflection.Missing.Value
Dim path As Object = "C:\Ales\Temp\Test.doc"

Dim doc As Document = word_app.Documents.Open(path, obj, obj, obj, obj, obj, obj, obj, _
obj, obj, obj, obj, obj, obj, obj, obj)

For Each table As Table In doc.Tables

Dim col_count As Integer = table.Columns.Count
Dim row_count As Integer = table.Rows.Count

For i As Integer = 1 To row_count
For j As Integer = 1 To col_count
Dim cell As Cell = table.Cell(i, j)
m_tb_output.Text &= cell.Range.Text.ToString() & vbTab
Next
m_tb_output.Text &= vbNewLine
Next

Next

End Sub

End Class

FlashM ::

Ok, tale koda bi bla mogoče malce boljša, ker zna prebrat tabelo, ki ima različno število stolpcev po posameznih vrsticah. Še vedno pa bi blo treba pohendlat primer, ko ima ista tabela v posameznih stolpcih različno število vrstic.


Imports System
Imports System.Windows.Forms
Imports Microsoft.Office.Interop.Word

Public Class Form1

Private Sub m_bt_start_read_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles m_bt_start_read.Click

Dim word_app As New Microsoft.Office.Interop.Word.Application()
word_app.Visible = False

Dim obj As Object = System.Reflection.Missing.Value
Dim path As Object = "C:\Ales\Temp\Test.doc"

Dim doc As Document = word_app.Documents.Open(path, obj, obj, obj, obj, obj, obj, obj, _
obj, obj, obj, obj, obj, obj, obj, obj)


For Each table As Table In doc.Tables

For i As Integer = 1 To table.Rows.Count

For j As Integer = 1 To table.Rows(i).Cells.Count

Dim cell_text As String = table.Cell(i, j).Range.Text.ToString()
m_tb_output.Text &= cell_text.Substring(0, cell_text.Length - 1) & vbTab

Next

m_tb_output.Text &= vbNewLine

Next

Next

word_app.Quit()

End Sub

End Class

FlashM ::

Prevedeno še v C# (koda je zgolj osnova)

using Microsoft.Office.Interop.Word;
using System.Windows.Forms;
using System;
using System.Diagnostics;

namespace WordDocReader
{
    class Program
    {
        static void Main(string[] args)
        {
            Microsoft.Office.Interop.Word._Application word_app = new Microsoft.Office.Interop.Word.Application();
            word_app.Visible = false;

            object obj = System.Reflection.Missing.Value;
            object path = @"C:\Ales\Temp\Test.doc";

            Document doc = word_app.Documents.Open(ref path, ref obj, ref obj, ref obj, ref obj, ref obj,
                                                             ref obj, ref obj, ref obj, ref obj, ref obj,
                                                             ref obj, ref obj, ref obj, ref obj, ref obj);

            foreach (Table table in doc.Tables)
            {
                for (int i = 1; i <= table.Rows.Count; i++)
                {
                    for (int j = 1; j <= table.Rows[i].Cells.Count; j++)
                    {
                        string cell_text = table.Cell(i, j).Range.Text.ToString();
                        Console.WriteLine(cell_text);
                    }
                }
            }
            word_app.Quit(ref obj, ref obj, ref obj);
        }
    }
}


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

EXCEL - poiskati besedni nizv koloni in vrstico kopirati na drugi list

Oddelek: Loža
61665 (1450) Malajlo
»

VB.net Excel v Tif

Oddelek: Programiranje
121155 (1054) saule
»

[Excel]Kako izvleči vrednost?

Oddelek: Programiranje
223800 (3523) Mobidick
»

[Visual studio .NET] Rabim pomoč

Oddelek: Programiranje
91605 (1447) darkolord
»

Visual Basic in Excel

Oddelek: Programiranje
262690 (2256) Vesoljc

Več podobnih tem