Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2017, 15:41   #1
nightofpromises
Пользователь
 
Регистрация: 01.03.2017
Сообщений: 31
Восклицание Сортировка по столбцам таблицы (MS Excel)

Отсортировать в каждом столбце диапазона ячейки с числовыми данными. Ячейки с нечисловыми данными и пустые не должны перемещаться. Реализовать в отдельном методе запись формул рабочего листа для определения сумм элементов строк, значения которых меньше нуля.
Когда я нажимаю на кнопку "Решение", у меня ничего не происходит! Помогите мне. Я не знаю, как решить проблему того что ничего не происходит, когда я нажимаю на кнопку "Решение" .
Диапазон Екселя.PNG

Код:
Public Class ЛистДиапазон
    Private Sub btn_reshenie_Click(sender As System.Object, e As System.EventArgs) Handles btn_reshenie.Click
        Dim Диапазон As КлассДиапазон = New КлассДиапазон(Me.Range("diapozonrange"),
                                                          Me.Range("sumelstr"))
        Диапазон.Обработать()
    End Sub
End Class
Class КлассДиапазон
    'Свойство содержащее ссылку на диапазон
    Private diapozonrange As Excel.Range
    Private sumelstr As Excel.Range
    'Конструктор класса (создает экземпляр класса)
    Sub New(diapozonrange As Excel.Range, sumelstr As Excel.Range)
        'Инициализация свойства класса
        Me.diapozonrange = diapozonrange
        Me.sumelstr = sumelstr
    End Sub
 
    'Метод для сортировки ячеек в каждом столбце с числовыми данными и записи формул рабочего листа для определения сумм элементов строк, значения которых меньше нуля.
    Sub Обработать()
        Try
            Dim i, j As Long
            Dim Ячейка As Excel.Range
            For Each Ячейка In diapozonrange.Cells
                If IsNumeric(Ячейка) And IsNothing(Ячейка) Then
                    For j = 1 To diapozonrange.Columns.Count
                        For i = 1 To diapozonrange.Rows.Count
                            diapozonrange.Sort(Key1:=diapozonrange.Cells(i, j).Value, Order1:=Excel.XlSortOrder.xlAscending, Orientation:=Excel.XlSortOrientation.xlSortColumns)
                        Next i
                    Next j
                End If
            Next Ячейка
 
            For i = 1 To diapozonrange.Rows.Count
                If i < 0 Then
                    sumelstr.Cells(i).formula = "SUM(" & diapozonrange.Rows(i).address(False, False) & ")"
                End If
            Next
 
        Catch ex As Exception
            MessageBox.Show(text:=ex.Message,
                            buttons:=MessageBoxButtons.OK,
                           caption:="Ошибка данных",
                           icon:=MessageBoxIcon.Error)
        End Try
    End Sub
End Class
nightofpromises вне форума Ответить с цитированием
Старый 19.10.2017, 16:22   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

а разве это не Visual Basic ?
а в MS Excel VBA (Visual Basic for Application) там есть свою ограничения и нюансы.
я ни разу не виде, чтобы в VBA использовалось назначение обработчика событий через handles.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.10.2017, 17:32   #3
nightofpromises
Пользователь
 
Регистрация: 01.03.2017
Сообщений: 31
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
а разве это не Visual Basic ?
а в MS Excel VBA (Visual Basic for Application) там есть свою ограничения и нюансы.
я ни разу не виде, чтобы в VBA использовалось назначение обработчика событий через handles.
это VB.Net
Я изменила код сортировки на сортировку методом пузырька. Все равно ничего не выходит
Код:
Public Class ЛистДиапазон
    Private Sub btn_reshenie_Click(sender As System.Object, e As System.EventArgs) Handles btn_reshenie.Click
        Dim Диапазон As КлассДиапазон = New КлассДиапазон(Me.Range("diapozonrange"),
                                                          Me.Range("sumelstr"))
        Диапазон.Обработать()
    End Sub
End Class
Class КлассДиапазон
    'Свойство содержащее ссылку на диапазон
    Private diapozonrange As Excel.Range
    Private sumelstr As Excel.Range
    'Конструктор класса (создает экземпляр класса)
    Sub New(diapozonrange As Excel.Range, sumelstr As Excel.Range)
        'Инициализация свойства класса
        Me.diapozonrange = diapozonrange
        Me.sumelstr = sumelstr
    End Sub

    'Метод для сортировки ячеек в каждом столбце с числовыми данными и записи формул рабочего листа для определения сумм элементов строк, значения которых меньше нуля.
    Sub Обработать()
        Try
            Dim i, j As Long
            Dim temp As Long
            For j = 1 To diapozonrange.Columns.Count
                For i = 1 To diapozonrange.Rows.Count - 1
                    If IsNumeric(diapozonrange.Cells(i, j)) Then
                        If IsNothing(diapozonrange.Cells(i, j)) Then
                            If (diapozonrange.Cells(i, j) > diapozonrange.Cells(i, j + 1)) Then
                                temp = diapozonrange(i, j)
                                diapozonrange(i, j) = diapozonrange(i, j + 1)
                                diapozonrange(i, j + 1) = temp
                            End If
                        End If
                    End If
                Next i
            Next j

            For i = 1 To diapozonrange.Rows.Count
                If i < 0 Then
                    sumelstr.Cells(i).formula = "SUM(" & diapozonrange.Rows(i).address(False, False) & ")"
                End If
            Next i

        Catch ex As Exception
            MessageBox.Show(text:=ex.Message,
                            buttons:=MessageBoxButtons.OK,
                           caption:="Ошибка данных",
                           icon:=MessageBoxIcon.Error)
        End Try
    End Sub
End Class

Последний раз редактировалось nightofpromises; 19.10.2017 в 17:47.
nightofpromises вне форума Ответить с цитированием
Старый 19.10.2017, 21:51   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от nightofpromises Посмотреть сообщение
это VB.Net
Я изменила код сортировки на сортировку методом пузырька. Все равно ничего не выходит
Вы меня не поняли.
я говорю о том, что я не уверен, что ваша конструкция в MS Excel работает.

конкрентно вот это:

Цитата:
Сообщение от nightofpromises Посмотреть сообщение
Код:
Private Sub btn_reshenie_Click(sender As System.Object, e As System.EventArgs) Handles btn_reshenie.Click
у меня нет уверенности, что ваша кнопка с именем btn_reshenie (кстати, а такая кнопка вообще есть?!) получает таким образом назначенный обработчик.


тогда уже так попробывать:
Код:
Public Class ЛистДиапазон
    Private Sub btn_reshenie_Click(sender As System.Object, e As System.EventArgs) Handles btn_reshenie.Click
      MsgBox "On Button Click Fire!"
    End Sub
End Class
но, честно говоря, я не уверен, что сообщение появится после нажатия на кнопку.

А зачем Вам такое назначение?
почему просто не взять и не назначить макрос на кнопку средствами конструктора в MS Excel?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.10.2017, 17:12   #5
nightofpromises
Пользователь
 
Регистрация: 01.03.2017
Сообщений: 31
Восклицание

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Вы меня не поняли.
я говорю о том, что я не уверен, что ваша конструкция в MS Excel работает.

конкрентно вот это:


у меня нет уверенности, что ваша кнопка с именем btn_reshenie (кстати, а такая кнопка вообще есть?!) получает таким образом назначенный обработчик.


тогда уже так попробывать:
Код:
Public Class ЛистДиапазон
    Private Sub btn_reshenie_Click(sender As System.Object, e As System.EventArgs) Handles btn_reshenie.Click
      MsgBox "On Button Click Fire!"
    End Sub
End Class
но, честно говоря, я не уверен, что сообщение появится после нажатия на кнопку.

А зачем Вам такое назначение?
почему просто не взять и не назначить макрос на кнопку средствами конструктора в MS Excel?
Сообщение появляется после нажатия на кнопку (ну после того как я код заменила на другой). Вот архив с программой. Помогите мне.
Практическая №4.rar
nightofpromises вне форума Ответить с цитированием
Старый 20.10.2017, 19:26   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Код:
If IsNumeric(diapozonrange.Cells(i, j)) Then
Проверяете ячейку, а нужно значение в ячейке.
diapozonrange.Cells(i, j) - это Cell (или Range, забыл уже) с кучей свойств и методов, это не число.
Код:
If IsNumeric(diapozonrange.Cells(i, j).Value) Then
и дальше по коду так же не путаем ячейку и значение, записанное в ячейку.
ячейках будет не жестко заданное число, а формула.
Вообще, там есть нюансы, возможно нужно будет работать со свойством Value2 или FormulaR1C1. Зависит от содержимого ячеек, форматов ячеек и т.д. и т.п.
pu4koff вне форума Ответить с цитированием
Старый 20.10.2017, 19:46   #7
nightofpromises
Пользователь
 
Регистрация: 01.03.2017
Сообщений: 31
Печаль

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Код:
If IsNumeric(diapozonrange.Cells(i, j)) Then
Проверяете ячейку, а нужно значение в ячейке.
diapozonrange.Cells(i, j) - это Cell (или Range, забыл уже) с кучей свойств и методов, это не число.
Код:
If IsNumeric(diapozonrange.Cells(i, j).Value) Then
и дальше по коду так же не путаем ячейку и значение, записанное в ячейку.
ячейках будет не жестко заданное число, а формула.
Вообще, там есть нюансы, возможно нужно будет работать со свойством Value2 или FormulaR1C1. Зависит от содержимого ячеек, форматов ячеек и т.д. и т.п.
так тоже самое выходит
ничего не происходит при нажатии кнопки, даже если я проверяю значение, а не саму ячейку
nightofpromises вне форума Ответить с цитированием
Старый 20.10.2017, 19:51   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Дальше проверка идёт:
Код:
If IsNumeric(diapozonrange.Cells(i, j)) Then
                        If IsNothing(diapozonrange.Cells(i, j)) Then
какая ячейка должна быть пустой? А то сначала проверяем, что в ней число, а потом, что в ней нет ничего. естественно ничего обрабатываться не будет.
pu4koff вне форума Ответить с цитированием
Старый 20.10.2017, 20:00   #9
nightofpromises
Пользователь
 
Регистрация: 01.03.2017
Сообщений: 31
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Дальше проверка идёт:
Код:
If IsNumeric(diapozonrange.Cells(i, j)) Then
                        If IsNothing(diapozonrange.Cells(i, j)) Then
какая ячейка должна быть пустой? А то сначала проверяем, что в ней число, а потом, что в ней нет ничего. естественно ничего обрабатываться не будет.
я поменяла условия местами. ничего не изменилось.
nightofpromises вне форума Ответить с цитированием
Старый 20.10.2017, 20:10   #10
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Цитата:
Сообщение от nightofpromises Посмотреть сообщение
я поменяла условия местами. ничего не изменилось.
А смысл их местами менять?
Сначала смотрим: ага. пустая ячейка. следующим условием проверяем: в пустой ячейке записано число? естественно дальше этих проверок никуда не уйдём. Тут или ячейка пустая или в ней число. Может вообще это IsNothing выкинуть или чего этим хотите проверить?
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка одинаковых значений по двум столбцам. Excel 2007 Client2006 Microsoft Office Excel 6 15.04.2013 07:00
Сортировка по столбцам. павел павел Microsoft Office Access 28 09.11.2012 20:25
Сортировка по столбцам. (Паскаль) xEk Помощь студентам 0 20.05.2012 12:01
Сортировка по нескольким столбцам таблицы. S_Yevgeniy Помощь студентам 3 27.07.2011 19:03
Сортировка таблицы по нескольким столбцам KobolD Помощь студентам 0 21.06.2010 17:21