Forum » Programiranje » 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
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
- spremenil: DonMatejo ()
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...
____
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…
- spremenil: DonMatejo ()
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
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
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 ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | EXCEL - poiskati besedni nizv koloni in vrstico kopirati na drugi listOddelek: Loža | 1665 (1450) | Malajlo |
» | VB.net Excel v TifOddelek: Programiranje | 1155 (1054) | saule |
» | [Excel]Kako izvleči vrednost?Oddelek: Programiranje | 3800 (3523) | Mobidick |
» | [Visual studio .NET] Rabim pomočOddelek: Programiranje | 1605 (1447) | darkolord |
» | Visual Basic in ExcelOddelek: Programiranje | 2690 (2256) | Vesoljc |