Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
1 / 1 / 3
Регистрация: 16.09.2013
Сообщений: 307
1
.NET 3.x

Неправильно определяется последняя заполненная строка Excel

23.09.2016, 12:37. Показов 2518. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
День добрый!

Октрываю книгу Excel, на первом листе скажем 100 строк, копирую эти строки на новый лист и запускаю функцию Удалить Дубликаты, при этом скажем у меня на втором листе остается 50 строк. Но все еще при попытке определения последней заполненной строки пишет 100ю Почему?(

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
            Excel.Workbook xlWb = xlApp.Workbooks.Open(openFileDialog1.FileName,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing);
 
            xlWb.Worksheets.Copy(After: xlWb.Sheets[xlWb.Sheets.Count]);
 
            Excel.Worksheet xlWs = (Microsoft.Office.Interop.Excel.Worksheet)xlWb.Sheets[2];
 
            // UsedRange - использованный диапазон. Находим последнюю заполненную строку и столбец.
            int fullRow = xlWs.UsedRange.Rows.Count;
            int fullCol = xlWs.UsedRange.Columns.Count;
            Range rng = xlWs.Range[xlWs.Cells[1,1], xlWs.Cells[fullRow, fullCol]];
 
            object cols = new object[] { 7, 9 };
            rng.RemoveDuplicates(cols, XlYesNoGuess.xlNo);
 
            int lastRow = xlWs.Cells.SpecialCells(XlCellType.xlCellTypeLastCell, Type.Missing).Row;
 
            
            double smm = xlApp.WorksheetFunction.Sum(xlWs.Range["H:H"]);
 
            xlWs.Cells[lastRow, 8] = smm;
 
 
            xlApp.Visible = true;
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.09.2016, 12:37
Ответы с готовыми решениями:

Вывод в Excel, последняя строка повторяется несколько раз
Не выводиться нормально в Excel, есть готовый шаблон в который вывожу , 4 строки выводятся...

HDD определяется в BIOS но не запускается и неправильно определяется объем диска
Всем доброго времени суток, прошу вас о помощи в борьбе с моим винтом от ноута. Попробую описать...

Событие SheetChange: последняя строка и выделенная строка является одинаковой величиной
Не срабатывает корректно событие. При вводе данных в следующую строку после последней, последняя...

Процессор неправильно определяется
недавно собрал пк на процессоре g4500, и через несколько дней заметил что в программе speccy он...

11
997 / 356 / 135
Регистрация: 27.10.2006
Сообщений: 764
23.09.2016, 12:45 2
Подставьте свою переменную отвечающую за лист вместо xlSht

C#
1
int iLastRow = xlSht.Cells[xlSht.Rows.Count, "A"].End[Excel.XlDirection.xlUp].Row;  //последняя заполненная строка в столбце А
0
1 / 1 / 3
Регистрация: 16.09.2013
Сообщений: 307
23.09.2016, 12:57  [ТС] 3
Цитата Сообщение от Pavel55 Посмотреть сообщение
.End[Excel.XlDirection.xlUp].Row;
здесь ошибку выдает..
Object does not contain definition END
0
997 / 356 / 135
Регистрация: 27.10.2006
Сообщений: 764
23.09.2016, 13:09 4
А вы добавили в самом верху проекта?

C#
1
using Excel = Microsoft.Office.Interop.Excel;
Так же нужно подключить ссылку на Microsoft Excel 15.0 Object Library в меню Project - Add Reference... - COM (у вас может быть другая версия Excel - 14.0, 12.0 и т.д.)
0
1 / 1 / 3
Регистрация: 16.09.2013
Сообщений: 307
23.09.2016, 13:22  [ТС] 5
Цитата Сообщение от Pavel55 Посмотреть сообщение
using Excel = Microsoft.Office.Interop.Excel;
да конечно. Просто незнаю почему, но последняя строка в новом листе после удаления дубликатов не определяется.

Добавлено через 11 минут
У меня только 14.0.
0
997 / 356 / 135
Регистрация: 27.10.2006
Сообщений: 764
23.09.2016, 22:11 6
Лучший ответ Сообщение было отмечено ViterAlex как решение

Решение

Может ваша переменная xlWs у вас отвечает не за тот лист, на который вы скопировали данные и удалили дубликаты

Добавлено через 8 часов 19 минут
Кстати,

UsedRange - не обновляется, если вы удалили данные с листа, пока не сохраните книгу.
Объясню. Например, у вас есть данные в ячейка А1:Z100
Что покажет UsedRange? Он покажет диапазон A1:Z100 - т.е. всё правильно, нас это устраивает.
Затем вы удаляете все данные в строках с 10 до 100
Таким образом сейчас у вас данные только в А1:Z9
Что покажет UsedRange? Он покажет снова диапазон A1:Z100 - А ЭТО УЖЕ НЕПРАВИЛЬНО!
UsedRange перестраивается только после сохранения книги.
Таким образом, если вы удалили данные с листа, вам нужно сперва сохранить книгу, а потом снова запросить данные UsedRange.

Чтобы этого не делать, я вам предлагаю другой вариант нахождения последней строки
C#
1
int iLastRow = xlSht.Cells[xlSht.Rows.Count, "A"].End[Excel.XlDirection.xlUp].Row;  //последняя заполненная строка в столбце А
если у вас нет скрытых строк и не установлен Автофильтр на таблицу, то данный способ корректно отобразит последнюю заполненную строку в указанном столбец (например, А)

Добавьте 2 ссылки на
- Microsoft Excel X.X Library Object
- Microsfot Office X.X Library Object


и напишите сверку

using Excel = Microsoft.Office.Interop.Excel;
using Microsoft.Office.Interop.Excel;
1
1 / 1 / 3
Регистрация: 16.09.2013
Сообщений: 307
25.09.2016, 07:41  [ТС] 7
Pavel55,

Да, действительно так и есть, как вы сказали.
Теперь нахожу последнюю строку так:

C#
1
int lastRow = xlWs.Cells.Find("*", System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlPrevious, false, System.Reflection.Missing.Value, System.Reflection.Missing.Value).Row;
Здесь:

C#
1
int iLastRow = xlSht.Cells[xlSht.Rows.Count, "A"].End[Excel.XlDirection.xlUp].Row;
у меня подчеркивается слово .END, может потому что у меня 14 Object Library? Откуда могу скачать 15 для 3.5 Net Framework-а?

Добавлено через 53 секунды
Или может потому что у меня MS Office 2010?
0
997 / 356 / 135
Регистрация: 27.10.2006
Сообщений: 764
25.09.2016, 20:38 8
Мне кажется, что это не зависит от версии Excel, возможно это зависит от этого

Добавьте 2 ссылки на
- Microsoft Excel X.X Library Object
- Microsfot Office X.X Library Object

и напишите сверку

using Excel = Microsoft.Office.Interop.Excel;
using Microsoft.Office.Interop.Excel;

P.S. А почему вам не перейти на 4.5 Framework?
0
1 / 1 / 3
Регистрация: 16.09.2013
Сообщений: 307
26.09.2016, 06:58  [ТС] 9
Pavel55,

Просто по умолчанию на 7 не идет nfw 4.5, а просто идет 3.5 кажется, поэтому и сделал программку на 3.5 ))

Тогда по моему на .Net 3.5 нет этих библиотек и соответсвенно функций
0
.NET senior
440 / 358 / 137
Регистрация: 23.09.2016
Сообщений: 980
26.09.2016, 07:19 10
nuroraf, на Windows 7 отлично устанавливаются .NET Framework вплоть до версии 4.6.1
0
997 / 356 / 135
Регистрация: 27.10.2006
Сообщений: 764
26.09.2016, 08:17 11
nuroraf, да, скачайте любую новую версию framework с сайта microsoft. У меня тоже windows7, как и у большинства на форуме
0
1 / 1 / 3
Регистрация: 16.09.2013
Сообщений: 307
05.10.2016, 08:49  [ТС] 12
bax_tang,
Я имел ввиду, что по умолчанию на Windows 7 есть только версия 3.5, чтобы программка работала без установки версий выше. Это я знаю, что устанавливать можно и версии выше ))

Всем Спасибо!
0
05.10.2016, 08:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.10.2016, 08:49
Помогаю со студенческими работами здесь

Неправильно определяется кодировка
здравствуйте. есть php-скрипт, берущий первую строку из загруженного на сайт файла. путём...

Неправильно определяется флешка
Знакомый попросил посмотреть флешку, сказал что не открывается, а на ней какая-то ценная для него...

Неправильно определяется класс
Вот такая штука Хочу по клику менять фон элемента. <span class='sel'> Солнце </span><br> <span...

Неправильно определяется конец строки
есть тело программы - i=0; f1.getline(mas, 200); while (mas !=...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru