Excel edit VB.NET   otázka

VB.NET

Ahojte

Mám excel pomocou listview načítam obsah z neho.

a chcel by som sa opýtať ako editovať a upraviť prvý Item tak aby mi to prepísal aj v Exceli.

Tento kod mi ho prepíše ale len v Listview nie v Exceli.

Dim lvItem As ListViewItem

        lvItem = ListView1.SelectedItems(0)
        lvItem.Text = TextBox1.Text

tu je kod na vyčítanie z Excelu

Dim cCount As Integer
        Dim azr As Microsoft.Office.Interop.Excel.Range
        azr = worksheet.UsedRange
        Dim lvItem As ListViewItem

        For cCount = 6 To azr.Rows.Count
            'ListView1.Columns.Add(azr.Cells(cCount, 1).value)

            lvItem = ListView1.Items.Add(azr.Cells(cCount, 4).value)

            lvItem.SubItems.Add(azr.Cells(cCount, 1).value)

ďakujem za odpoveď

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Hodnotu nutno změnit v Range (azr) :

Range.Cells(r1,c1).Value = ListView.Items(r0).SubItems(c0).Text

Má-li být hodnota číslo, datum, pak ji předat ve správném formátu.

Range má sloupce a řádky od 1 do počtu řádků či sloupců, nutno vzít

v úvahu je-li či ne záhlaví sloupců, Listview má Items a SubItems

od 0 do počtu Items nebo SubItems minus 1 , SubItem(0) vrátí Item.

Pro uložení zavolat metodu Workbook.Save a zbavit se dialogu excelu

před uložením, kde pomůže vlastnost Application.DisplayAlerts.

Application.DisplayAlerts = False '(Application= Excel.Application)
Workbook.Save '(Workbook=Worksheet.Parent)
Application.DisplayAlerts = True '(Application=Workbook.Parent)

ListView, Range, Application, Workbook ,Worksheet

nahraďte dle vlastní deklarace dle svého uvážení.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ještě přidám tip od Pavla Hlávky z jiného vlákna :

Tady je pěkně zpracovaný článek pro čtení a zápis do Excelu.

http://www.visual-basic-tutorials.com/Wr...

Pozor jen na název listu Excelu ( List1, nebo List2, List3, ... )!!!

... v aj verzi Sheet1, Sheet2 ...

Další spoustu toho naleznete zde hledáním na webu, zkuste ...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Aha čiže ak som to správne pochopil :

Môj prvý riadok ktorý načítam je až 6ty a stlpec je 2hý.

Dim lvItem As ListViewItem

lvItem = ListView1.SelectedItems(0)

lvItem.Text = TextBox1.Text

azr.Cells(6,2).Value = ListView.Items(0).SubItems(0).Text

Workbook.Save 

Takto by to malo fungovať naozaj Dakujem za rada Veľké Ďakujem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Urobil sis sám, takže nemáš za co. :) Fajn, že pomohlo.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ahoj

Ešte som sa chcel spýtať ako spraviť to že v mojom listview Item nebude vždy 0tý item zodpovedať 6riadku bude raz 15ty riadok potom 30 a potom zase 31 zakaždým iný ako to dosiahnuť ?

ako zadefinovať napr i aby to tak fungovalo ?

azr.Cells((i), 4).Value = ListView1.Items(i).SubItems(0).Text
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Moc tomu nerozumím...

Vždy bude první řádek Listview poslední z excel Range?

Koukněte na Range.Rows.Count pro počet řádků, pak by :

value = azr.Cells(azr.Rows.Count, c).Value

byla hodnota buňky z posledního řádku ze sloupce c .

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Takto mám excel z neho načítavam a aj tam pridávam dáta následne ich späť načítavám do listview no načítam iba tie ktoré majú červené písmo no ja netuším ktoré sú červeným raz to bude 31 riadok raz 33 a potom zase 38 zakaždým bude iný nie ten istý.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Záleží, má-li celý řádek červené písmo nebo třeba jen libovolná buňka.

Bude-li Range obsahovat celý řádek může to být několik buněk s různou barvou.

Červené písmo :

Range.Font.Color = vbRed '(vbRed = 255)

Při plnění listview procházením range cyklem rozpoznat dle barvy písma vyhovující řádky a zapamatovat si pro každé listview item index řádku, třeba ve vlasnosti Tag nebo uložit indexy pro spárování řádků v nějakém poli či listu.

Do listview lze také načíst vše a obarvit řádky listview pomocí ForeColor červeně jako v excelu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

ja to mám nastavené takto jeden riadok zafarbím vždy v rovnakom stlpci.

worksheet.Cells(emptyRow, 4).Range.Font.Color = Color.Red

ale ešte to nemám nastevené aby mi čítalo iba červené písmo lebo podmienka if then mi nefunguje ale aj tak potom netuším ako to spraviť aby prepísalo v exceli to čo prepíšem v Lisview

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zadáním je načíst řádky z listu excelu a hledat řádky, kde je v daném sloupci červený font.

EXCEL :

Pokusný list sešitu má na prvním řádku definované záhlaví, třeba čtyři sloupce,

kde nyní v posledním se očekává výskyt červeného fontu písma.

Vytvořit tabulku, pár řádků s daty, v posledním sloupci někde červeně a uložit

sešit excelu. Vzorek nebyl dodán, lze tedy plně rozvinout fantazii.

VS :

Do nového formu nového projektu vložit kód a opravit cestu a název listu v kódu.

Po spuštění načte data z listu do datatable s pomocným sloupcem pro barvu fontu,

která se předá jako zdroj pro datagridview, kde se dle očekávání zobrazí data

z použité oblasti vašeho pokusného listu excelu. V opačném případě lituji...

Střídavým klepnutím myší na rohovou buňku, kde se kříží záhlaví řádků a sloupců,

lze ovlivnit zobrazení všechna data nebo jen řádky, kde bylo to červené písmo.

Klepnutím myši na záhlaví řádku se zobrazí jeho index v datatable a v excelu.

Stejně tak by měl jít zjistit index po seřazení některého sloupce datagridview.

Tady se snažím poprat s indexy řádků :

Public Class Form1
    Private dgv As DataGridView

    Public Sub New()

        ' This call is required by the Windows Form Designer.
        InitializeComponent()
        ' Add any initialization after the InitializeComponent() call.

        dgv = New DataGridView
        With dgv
            .Dock = DockStyle.Fill
            .AllowUserToAddRows = False
        End With
        Me.Controls.Add(dgv)
        AddHandler dgv.CellClick, AddressOf dgv_CellClick

        Dim workbook_path As String = "C:\Documents and Settings\Vy\Dokumenty\Sešit1.xls(x)"
        Dim worksheet_name As String = "List1"

        Dim excel_app, excel_wb As Object
        Dim excel_type As Type = Type.GetTypeFromProgID("Excel.Application")
        excel_app = Activator.CreateInstance(excel_type)
        excel_wb = excel_app.Workbooks.Open(workbook_path)
        Dim excel_rng As Object = excel_wb.Worksheets(worksheet_name).UsedRange

        Dim dt As New DataTable
        For r As Integer = 1 To excel_rng.Rows.Count
            If r = 1 Then
                For c As Integer = 1 To excel_rng.Columns.Count
                    With dt
                        .Columns.Add(excel_rng.Cells(r, c).Value)
                    End With
                Next
                dt.Columns.Add("Font")
            Else
                Dim a_1 As Object = excel_app.Transpose(excel_app.Transpose(excel_rng.Rows(r).Value))
                Dim a_0(0 To excel_rng.Columns.Count) As Object
                For i As Integer = 0 To excel_rng.Columns.Count - 1
                    a_0(i) = a_1(i + 1)
                Next
                Dim redfont_column_index = excel_rng.Columns.Count
                a_0(excel_rng.Columns.Count) = excel_rng.Cells(r, redfont_column_index).Font.Color
                dt.Rows.Add(a_0)
            End If
        Next
        dgv.DataSource = dt

        excel_wb.Close(False)
        excel_wb = Nothing
        excel_app.Quit()
        excel_app = Nothing
    End Sub

    Private Sub dgv_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs)
        If e.RowIndex < 0 And e.ColumnIndex < 0 Then
            Dim dv As DataView = DirectCast(dgv.DataSource, DataTable).DefaultView
            dv.RowFilter = IIf(dv.RowFilter = String.Empty, "[Font]=255", String.Empty)
            dgv.Columns("Font").Visible = dv.RowFilter = String.Empty
        ElseIf e.ColumnIndex < 0 Then
            Dim dr As DataRow = CType(dgv.Rows(e.RowIndex).DataBoundItem, DataRowView).Row
            Dim idr As Integer = dr.Table.Rows.IndexOf(dr)
            MsgBox("Index řádku v datatable :" & idr & vbNewLine & _
            "Index řádku v excel range :" & (idr + 2))
        End If
    End Sub
End Class

Vlastní uložení nazpět je na Vašem uvážení, index řádku v excelu je známý,

předáte hodnotu ze sloupce a řádku do Range a uložíte metodou Workbook.Save.

Rozdíl 2 mezi indexem v datatable a v range způsoben tím, že číslování řádků,

je buď od nuly nebo od jedné a excel má v prvním řádku záhlaví.

V závislosti na tom, zda se bude ukládat vše najednou třeba před zavřením

nebo po provedení změny si přestěhujte potřebné proměnné do deklarační části

formuláře, budete-li chtít události datagridview, tak si přidejte WithEvents,

nebo datagridview a příp. další prvky vytvořte v návrhu formu a přejmenujte.

Před zavřením formu zajistit zavření excelu a uvolnění objektu, aby instance

nezůstávaly viset, hledat FinalReleaseComObject je to tady určitě několikrát.

LISTVIEW :

Pokud přetrvá touha plnit data do listview, lze se případně inspirovat příkladem

zde na webu a předat datatable jako zdroj DataListView poděděném z ListView, ale

čeká Vás další spousta práce, kterou datagridview bezpochyby ušetří.

Další podrobnosti najdete zde na webu, pouze ukázka :

Public Class DataListView
    Inherits ListView
 
    Public Sub SetDataSource(ByVal fromDataTable As DataTable)
        Me.Items.Clear()
        Me.BeginUpdate()
        For i As Integer = 0 To fromDataTable.Rows.Count - 1
            Dim lvItem As ListViewItem
            lvItem = Me.Items.Add(fromDataTable.Rows(i).Item(0).ToString)
            For j As Integer = 1 To fromDataTable.Columns.Count - 1
                lvItem.SubItems.Add(fromDataTable.Rows(i).Item(j).ToString)
            Next j
        Next i
        Me.EndUpdate()
    End Sub
 
    Public Sub New()
        Me.View = Windows.Forms.View.Details
        Me.HideSelection = False
        Me.GridLines = True
    End Sub
End Class

Podmínka s barvou mi fungovala, tak to zkuste a vylepšete si k obrazu svému.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Není známo k čemu a jak to vlastně má sloužit, pokud by tabulka měla

jedinečné hodnoty v některém ze sloupců (primární klíč), pak lze data

ukládat s pomocí aktualizačních dotazů.

(Připojit se k excelu (pomocí SELECT naplnit data do datatable),

UPDATE pro uložení změn, INSERT pro vložení řádku, ale DELETE

pro smazání řádku není excelem podporován.)

Od Excelu verze 2007 je možnost filtrovat podle barviček výplně i písma,

možná by šlo použít na tabulku filtr přímo v excelu (nebo s pomocí VBA).

Můžete vytvořit vlastní funkci (případně i pro vzorec do buňky), která

vrátí barvu nebo boolean (True/False) do pomocného sloupce pro získání

potřebných řádků k vyfiltrování. Pomocný sloupec využít v SELECT dotazu

při plnění datatable jako podmínku s WHERE. V případě zájmu přidám link.

Data lze také exportovat z excelu a importovat zpátky do excelu s výběrem

možností formátu souboru, což by mohlo případně taky nějak posloužit.

Pokud se Vám nikdo neozve na tu sicilskou adresu pro práci na zakázku,

přidejte podrobnosti, proč se realizace nedaří.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback