Dapatkan Nilai Sel di Excel dari Range

Bagaimana cara mengekstrak nilai sel dari objek rentang? Sepertinya itu harusnya sederhana. Pertanyaan Stackoverflow ini dan jawaban tidak terlalu membantu. Inilah yang ingin saya lakukan tetapi selalu gagal dengan pengecualian pada baris.kolom(0,0).

Dim rdr = oFindings.Range
For Each row As Excel.Range In rdr.Rows
   Dim Account = row.Columns(0,0).value2.tostring
   ' Do other stuff
Next

Untuk membuatnya berfungsi saya harus menerapkan kode ini:

For Each row As Excel.Range In rdr.Rows
    ndx = 0
    For Each cell As Excel.Range In row.Columns
        If ndx = 0 Then Account = NS(cell.Value2)
        ' Do other stuff
        ndx += 1
    next
Next

Sepertinya itu kludge. Apa rahasianya?


person Ebassador    schedule 02.09.2015    source sumber
comment
Apakah semuanya memiliki tipe yang sama? Apakah Anda mengetahui jenis selnya terlebih dahulu?   -  person SpaceSteak    schedule 02.09.2015
comment
pengecualian pada row.columns(0,0) tampaknya logis sejauh Excel (dan koleksi 2D apa pun di VB.NET atau dalam bahasa lain yang saya tahu) hanya mengharapkan 2 indeks dan Anda menyediakan 3. Variabel baris dalam loop foreach sama dengan rdr.Rows(indexRow); dan kemudian Anda menambahkan dua indeks lagi ke kolom. Sintaks yang benar adalah baris.Kolom(0).   -  person varocarbas    schedule 02.09.2015
comment
0 bukan indeks baris atau indeks kolom yang valid di Excel VBA   -  person Ron Rosenfeld    schedule 02.09.2015
comment
@RonRosenfeld Pertama, ini bukan VBA dan kedua 0 adalah indeks VBA yang valid dalam beberapa fungsi (meskipun tidak di sel Excel). Masalahnya di sini adalah ia memasukkan 3 indeks, bukan hanya 2 (masalah di VBA dan di sini, di VB.NET).   -  person varocarbas    schedule 02.09.2015
comment
@varocarbas Terima kasih atas klarifikasinya. Saya melakukan memasukkan dalam komentar saya bahwa ini berlaku untuk Excel VBA, dan dalam bahasa tersebut, Columns(0,0) bukan referensi rentang yang valid. Saya tidak yakin bagaimana ini bisa diterapkan pada masalah OP, tapi saya rasa ini mungkin informasi yang berguna.   -  person Ron Rosenfeld    schedule 02.09.2015
comment
@RonRosenfeld (mungkin saya salah memahami kalimat apriori yang sangat jelas 0 bukanlah indeks baris atau indeks kolom yang valid di Excel VBA; maaf soal itu, tetapi klarifikasi tidak pernah menjadi masalah bukan?). Bagaimanapun, ingatlah bahwa di VBA Kolom(0,0) sama salahnya dengan Kolom(2,2), sejauh Koleksi Kolom() hanya mengizinkan satu indeks (setara dengan sebagian besar koleksi yang disebut Kolom yang biasanya merupakan bagian dari emulasi tabel, seperti DataTable di .NET). Apakah klarifikasi ini oke atau niat Anda salah lagi?   -  person varocarbas    schedule 02.09.2015
comment
Sekadar catatan - sangat disarankan untuk tidak menggunakan row atau cell sebagai variabel, karena Row dan Cell berarti sesuatu yang implisit pada VBA. Saya akan mengubah variabel itu menjadi xRow atau cel atau apalah. Tidak ingin menimbulkan kebingungan!   -  person BruceWayne    schedule 02.09.2015
comment
@RonRosenfeld Kepada siapa saya harus memberikan penghargaan untuk hal ini? Itu adalah masalah penggunaan dua indeks di dalam loop For DAN Excel berbasis 1 bukan berbasis nol. Sekali lagi Stackoverflow terbukti menjadi sumber daya yang luar biasa! Terima kasih banyak!   -  person Ebassador    schedule 02.09.2015
comment
@varocarbas Maafkan saya. Bantuan Anda sangat kami hargai.   -  person Ebassador    schedule 02.09.2015
comment
@varocarbas Saya tidak bisa membantah temuan Anda. Itu sebabnya saya menanyakan pertanyaan itu sejak awal. Seperti yang Anda katakan, .Net berbasis 0. Namun, dalam hal ini apakah saya telah menggunakan (0,0) atau hanya (0), saya masih mendapat pengecualian. Juga, koreksi kode (VB.NET bukan VBA), mengharuskan saya menggunakan (1). Saya minta maaf karena saya tidak memiliki semua pengetahuan yang jelas Anda miliki. Saya hanya mencoba mempelajari sesuatu yang baru setiap hari. Stackoverflow membantu saya dalam hal itu! Aku menyukainya.   -  person Ebassador    schedule 02.09.2015
comment
@varocarbas Untuk memperjelas lebih lanjut poin yang saya coba sampaikan: rowindex dan columnindex adalah argumen bernama untuk berbagai objek rentang VBA. Maksud saya adalah, selain apa yang telah Anda tunjukkan tentang ketidakabsahan objek Kolom OP yang memiliki dua argumen, di VBA, argumen tersebut tidak boleh nol.   -  person Ron Rosenfeld    schedule 02.09.2015
comment
Beberapa ide untuk pembaca masa depan. IDE 1: ini adalah VB.NET (ditambah dengan Excel melalui Interop, tetapi sepenuhnya mengandalkan aturan .NET, misalnya SEMUA ARRAY BERBASIS 0). IDE 2: masalah kode ini adalah row.Columns(0,0) yang seperti dijelaskan di atas salah (jelaskan juga koreksinya), di VBA juga akan salah karena menggunakan DUA INDEKS (nol atau angka lainnya). IDE 3: VBA (bukan VB.NET) berbasis 1 hanya di bagian tertentu (seperti sel) tetapi tidak di bagian lain (array) dan mungkin diubah menjadi berbasis nol (ini hanya perilaku default).   -  person varocarbas    schedule 02.09.2015
comment
Ebassador, Anda harus memahami bahwa fakta bahwa ia mogok dalam situasi spesifik Anda tidak membuatnya salah sepenuhnya (mungkinkah kode Anda tidak sempurna?). Jika Anda tidak memiliki terlalu banyak pengetahuan tentang sesuatu dan seseorang (tampaknya) dengan lebih banyak pengetahuan tentang hal ini mengatakan sesuatu kepada Anda, mungkin Anda tidak perlu berpikir bahwa penafsiran acak mungkin bagus untuk berdebat dengan orang tersebut. Saya bersikeras: .NET (semua koleksi dalam bahasa .NET apa pun) berbasis nol; ketika Anda membaca dari Excel, informasinya disimpan dalam koleksi .NET (tidak ada hubungannya dengan VBA), yang berbasis 0.   -  person varocarbas    schedule 02.09.2015
comment
PS: alasan yang paling mungkin untuk masalah Anda adalah Anda melakukan .value2.ToString() tanpa memeriksa apakah .value2 benar-benar null (ide yang sangat buruk, karena jika null ToString() tidak akan ada dan kesalahan akan terjadi dipicu). Sel pertama di spreadsheet Anda (rdr.Rows(0).Columns(0) di VB.NET) kemungkinan besar kosong, nilai2 adalah null dan di sanalah Anda mendapatkan kesalahan.   -  person varocarbas    schedule 02.09.2015
comment
@RonRosenfeld Saya rasa saya telah memperjelas ide-ide ini di berbagai komentar, tetapi untuk berjaga-jaga inilah klarifikasi baru: koleksi Kolom di VBA (tidak ada hubungannya sama sekali dengan yang dibahas dalam pertanyaan ini, koleksi yang sama sekali berbeda memiliki nama yang sama dan yang mengikuti aturan VB.NET dan karenanya berbasis 0) berbasis 1 (hal yang sama untuk baris, sel, dll.). Ada beberapa hal di VBA (misalnya array) yang berbasis 0 (setidaknya, secara default; mungkin diubah). Bagaimanapun, bersikeras bahwa VB.NET Interop TIDAK ada hubungannya dengan VBA (hanya sintaksis yang serupa).   -  person varocarbas    schedule 02.09.2015
comment
@varocarbas Saya setuju, tapi saya hanya menulis tentang argumen bernama spesifik yang saya sebutkan, dan bukan tentang array VBA.   -  person Ron Rosenfeld    schedule 02.09.2015
comment
@RonRosenfeld Seperti yang dikatakan, semua koleksi yang terkait dengan sel sebenarnya (misalnya, Kolom, Baris, Lembar, Buku Kerja, dll.) dan beberapa fungsi sebenarnya berbasis 1; tetapi tidak semua yang ada di VBA berbasis 1 secara default.   -  person varocarbas    schedule 02.09.2015


Jawaban (1)


Sebagian besar masalah sudah disinggung, tapi inilah jawabannya dengan kode.

    Dim rdr As Excel.Range = oFindings.Range
    For Each row As Excel.Range In rdr.Rows

        'explicitly get the first cell as a range 
        Dim aCell As Excel.Range = row.Cells(1, 1)

        'explicity convert the value to String but don't use .String
        Dim Account as string = CStr(aCell.Value2)

        If Not String.IsNullOrEmpty(Account) Then

            ' Do other stuff

        End If

    Next

Penggunaan aCell.Value2.toString akan gagal jika sel kosong karena Value2 akan menjadi Nothing. Alih-alih gunakan CStr(aCell.Value2) yang tidak akan gagal. Namun kemudian Anda perlu menguji apakah string tersebut null atau kosong sebelum menggunakan nilainya.

person D_Bester    schedule 03.09.2015