Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 08.10.2014
Сообщений: 7
1

Разбить строку на слова по нажатию первой кнопки, отсортировать список слов по нажатию второй

08.10.2014, 21:37. Просмотров 1207. Ответов 14
Метки нет (Все метки)

Разбить строку, введённую в первую ячейку первого столбца активного листа, на слова, и вывести их в ячейки первого столбца, начиная со второй. Словом считается любая последовательность букв и цифр. Слова разделяются знаками препинания и/или пробелами. Идущие подряд разделители считаются одним. Полученный список слов отсортировать по возрастанию во втором столбце, начиная со второй строки. Для процедуры разбиения использовать одну кнопку, для процедуры сортировки – вторую.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.10.2014, 21:37
Ответы с готовыми решениями:

Загрузка второй формы по нажатию кнопки в первой
Приведите пример кода где при нажатии клавиши первой формы возникает вторая форма ( первая при этом...

Открытие второй формы по нажатию кнопки из первой
помогите, я хочю открыть вторую форму при нажатии клавиши на первой форме. Как это сделать?

Запуск таймера на второй форме по нажатию кнопки на первой
Добрый день, столкнулся с проблемой, имеются 2 формы, нужно что бы таймер запускался во второй...

По нажатию кнопки во второй форме изменить свойства компонента в первой
Здравствуйте! есть 2 формы: Form1 и Form2 На 1 находится TextBox на 2 Button. Можно ли сделать...

14
3877 / 1297 / 355
Регистрация: 07.08.2013
Сообщений: 3,284
09.10.2014, 07:51 2
NickBerhard, ну так на чем вы остановились? что не понятно?
самое трудное в вашей задаче это создать кнопку

Не по теме:

решите для себя что вы хотите: знания и умения или сдать задание
делать за вас задание, я например, не буду - чем больше таких "специалистов" тем выше моя ценность
если вы хотите получить знания - пытайтесь что-то сделать и если что-то будет не правильно подскажу и объясню

0
0 / 0 / 0
Регистрация: 08.10.2014
Сообщений: 7
09.10.2014, 12:44  [ТС] 3
остановился на сортировке слов. скорее всего их нужно отсортировать по возрастанию длины слова. но это все нужно привязать к процедуре в первой кнопке (то есть я нажимаю первую кнопку-слова разбиваются, нажимаю вторую-эти же слова сортируются) вот этот код у меня не получается написать. помогите, пожалуйста

Добавлено через 1 минуту
snipe, остановился на сортировке слов. скорее всего их нужно отсортировать по возрастанию длины слова. но это все нужно привязать к процедуре в первой кнопке (то есть я нажимаю первую кнопку-слова разбиваются, нажимаю вторую-эти же слова сортируются) вот этот код у меня не получается написать. помогите, пожалуйста
0
3877 / 1297 / 355
Регистрация: 07.08.2013
Сообщений: 3,284
09.10.2014, 13:38 4
т.е. все-таки желание учиться
начнем - с
1. нужно из Строки удалить все символы которые являются разделителем
способов много можно воспользоваться функцией Replace (возможно и не один раз)
можно вот так
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Dim StrStroka As String
Dim Stroka As String
StrStroka = Cells(1, 1)
For i = 1 To Len(StrStroka)
Select Case Mid(StrStroka, i, 1)
Case " ", ",", ".", "!", ":", ";", "/"
Stroka = Stroka & "*"
Case Else
Stroka = Stroka & Mid(StrStroka, i, 1)
End Select
Next i
теперь когда от всех знаков препинания избавились и от пробелов тоже - осталось избавиться от двойных тройных четверных * (если вы заметили то код выше меняет знаки препинания и пробелы на *)
избавляемся
Visual Basic
1
2
3
do while instr(1,Stroka,"**")>0
Stroka=replace(Stroka,"**","*")
loop
теперь разбираем строку на составляющие
Visual Basic
1
2
dim a() as String
a()=Split(Stroka,"*")
далее определяем границы массива
Visual Basic
1
2
dim dfg as Long
dfg=Ubound(a)
теперь выгружаем массив в столбцы А и В
Visual Basic
1
2
3
4
for i=2 to dfg+2
Cells(i,1)=a(i-2)
Cells(i,2)=a(i-2) 
next i
далее включаем макрорекордер и получаем примерно вот такой код сортировки от А до Я
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Range("B2:B" & dfg + 2).Select
Range("B" & dfg + 2).Activate
    ActiveWorkbook.Worksheets("Лист1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Лист1").Sort.SortFields.Add Key:=Range("B2:B" & dfg + 2), _
    SortOn:=xlSortOnValues, Order:=1, DataOption:=0
    With ActiveWorkbook.Worksheets("Лист1").Sort
        .SetRange Range("B2:B" & dfg + 2)
        .Header = 0
        .MatchCase = False
        .Orientation = 1
        .SortMethod = 1
        .Apply
End With
ах да сортировка по длине слова - выгрузим в столбец С
ну тут все просто
сначала определяем количество символов в самом длинном слове
Visual Basic
1
2
3
4
wer = 0
For i = 0 To dfg
If wer < Len(a(i)) Then wer = Len(a(i))
Next i
ну а теперь выгружаем в порядке возрастания количества символов
Visual Basic
1
2
3
4
5
6
7
8
y = 2
For i = 1 To wer
For k = 0 To dfg
If Len(a(k)) = i Then
Cells(y, 3) = a(k)
y = y + 1
End If
Next k
2
5532 / 1335 / 147
Регистрация: 08.02.2009
Сообщений: 4,063
Записей в блоге: 30
09.10.2014, 18:27 5
snipe, замечательный обучающий пост, но, похоже, топикстартеру не хочется в нём разбираться.

Есть неплохая заготовка в теме Процедура распечатки массива девяти слов и этих же слов с заглавной буквы по столбцам — там иллюстрируются, в частности, такие мощные инструменты (методы) VB for Excel, как ShrinkToFit, а особенно Resize.

Цитата Сообщение от NickBerhard Посмотреть сообщение
скорее всего их нужно отсортировать по возрастанию длины слова
Ну это вы передёргиваете. Сортируем как обычно — по алфавиту.
0
0 / 0 / 0
Регистрация: 08.10.2014
Сообщений: 7
09.10.2014, 18:47  [ТС] 6
спасибо большое. ваши подсказки очень ценны. но мы еще не учили процедуры case else, range,
ссылки на лист при сортировке. все это должно происходить через самые простые циклы..
вот, что у меня есть..это только разбивка строки на слова
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Sub Кнопка()
    Dim z As String
    Dim j As Integer
    Dim h As String
    Dim e As String
    Dim n
    n = 1
    z = Cells(1, 1).Value
    For j = 1 To Len(z)
    h = Asc(Mid(z, j, 1))
            If (h > 47 And h < 58) Or (h > 64 And h < 91) Or (h > 96 And h < 123) Or (h > 191 And h < 256) Then
            e = e & Mid(z, j, 1)
            Else
                    If Len(e) > 0 Then
                    n = n + 1
                    Cells(n, 1).Value = e
                    e = ""
                    End If
            End If
    Next j
       If Len(e) > 0 Then n = n + 1: Cells(n, 1).Value = e
End Sub


про то как сортировать одномерный массив я знаю только это

Visual Basic
1
2
3
4
5
6
7
8
9
   For i = LBound(a) To UBound(a) - 1
    For j = i + 1 To UBound(a)
        If a(j) < a(i) Then
            buffer = a(j)
            a(i) = a(j)
            a(i) = buffer
        End If
         Next
    Next
0
5532 / 1335 / 147
Регистрация: 08.02.2009
Сообщений: 4,063
Записей в блоге: 30
09.10.2014, 19:24 7
Цитата Сообщение от NickBerhard Посмотреть сообщение
...еще не учили процедуры case else
Мне интересно не чему вас недоучили, а на что способен ВБА (в частности, в Эксселе).

Если при каждом шаге программы кричать "ой, только не это" — обучению конец!
0
Заблокирован
09.10.2014, 19:39 8
Самое эффективное обучение, это когда ты один на один с компом,
без онлайн помощи, и вопрос стоит на гране жизни и смерти,
нельзя научить человека, которого никто и ничто не заставляет учиться
0
3877 / 1297 / 355
Регистрация: 07.08.2013
Сообщений: 3,284
09.10.2014, 19:52 9
NickBerhard, вам написан макрос (один для ваших двух заданий)
все что вам нужно это
в модуле написать
Sub macro1()
нажать ентер
и между строк Sub macro1() и End Sub
вставить последовательно все те кусочки что я вам написал
и код заработает

вот вам хорошо есть кто-то кто пытается вам разжевать и положить в рот знания
мне, например, пришлось изучать все самому ибо учителей в нужный момент не было

а вообще очень даже не плохо научиться пользоваться справкой или MSDN
так же очень хорошо помогает набить руку разбор кода других проггеров( я специально писал кусочками и пояснял что каждый кусочек делает)
и самое главное надо знать что делают операторы и функции ( это база- без нее ни куда) даже если вы ими еще не умеете пользоваться - важно знать что происходит
ибо сначала надо понять что делает кусок кода, как он это делает а уж потом применять все это дело на практике
для вас простая задача - разобраться почему я написал каждую строчку - подсказки даны надо только разобраться в операторах

и еще VBA не такой строгий язык- по сему указание на свойство value не обязательно т.е запись Cells(1,1) и Cells(1,1).Value одинаковы
2
Sasha_Smirnov
09.10.2014, 19:59
  #10

Не по теме:

Форум превратили в педсовет — ученик в панике убёг!

0
Заблокирован
09.10.2014, 20:52 11
Цитата Сообщение от snipe Посмотреть сообщение
Cells(1,1) и Cells(1,1).Value одинаковы
это называеться у класса Cells, свойство Value, принимается по умолчанию
дефолтное свойство (Default), и которое может быть только в еденичном случае
в наборе свойств, для каждого класса

Не по теме:

..решил окончательно запугать ученика

2
0 / 0 / 0
Регистрация: 08.10.2014
Сообщений: 7
09.10.2014, 21:02  [ТС] 12
Sasha_Smirnov, понимаете, что есть рамки , за которые нельзя выйти, ибо это не предусмотрено учебной программой? поэтому , спасибо на том, что есть))
0
Заблокирован
09.10.2014, 21:15 13
Всегда можно откатить вот чем...
вот я посмотрел, проанализировал самостоятельно, сделал домашнее задание
и решил сделать так, (такой вот я умный )), думаю за это тебя только похвалят
если-же конечно не имеются других конфликтов

Добавлено через 7 минут
Был случай, когда я заболел, (еще когда учился в школе)
учился так-себе, и дома решил самостоятельно подтянуться по алгебре,

так вот, после моего выздоровления, я очень удивил своего учителя тем,
что я освоил всю алгебру до конца учебного года, она не знала куда меня девать
хотя я мог себе позволить иногда не ходить на это занятие
и никто ко мне не прикапывался с вопросами, почему меня не было ))
0
0 / 0 / 0
Регистрация: 08.10.2014
Сообщений: 7
09.10.2014, 21:34  [ТС] 14
Антихакер32, я соглашусь, с вами, что это хорошо, когда человек преуспевает в чем-то и вылазит за рамки стандартов..эту тему можно обсуждать вдоль и поперек сколько угодно, но не здесь и не сейчас. у меня другая цель-сделать так, как нужно, а не так , как я хочу. спасибо)
0
Заблокирован
09.10.2014, 22:59 15
Лучший ответ Сообщение было отмечено Sasha_Smirnov как решение

Решение

Цитата Сообщение от NickBerhard Посмотреть сообщение
цель-сделать так, как нужно
!!!
Visual Basic
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
29
30
31
32
33
Option Explicit
Const Ex = "Разбить строку, введённую в первую ячейку первого столбца активного листа, на слова, и вывести их в ячейки первого столбца, начиная со второй. Словом считается любая последовательность букв и цифр. Слова разделяются знаками препинания и/или пробелами. Идущие подряд разделители считаются одним. Полученный список слов отсортировать по возрастанию во втором столбце, начиная со второй строки. Для процедуры разбиения использовать одну кнопку, для процедуры сортировки – вторую"
Dim f&, s$, j$(), v
Sub Macro()
    Dim f&
    [a1] = Ex
    For Each v In ActiveSheet.Buttons: v.Delete: Next
    For f = 1 To 2
        With ActiveSheet.Buttons.Add(100, 30 * f, 60, 20)
            .OnAction = "Макрос" & f
            .Caption = Choose(f, "Разбить", "Сортировать")
        End With
    Next
End Sub
Sub Макрос1()
    j = Split([a1])
    look
End Sub
Sub Макрос2()
    If Join(j) = "" Then j = Split([a1])
    qSortStr j, 0, UBound(j)
    look
End Sub
Public Sub qSortStr(List() As String, ByVal min As Long, ByVal max As Long)
    Dim i&, l&: Static s1$, s2$
    i = min: l = max: s1 = List((i + l) \ 2)
    Do Until i > l: While List(i) < s1: i = i + 1: Wend: While List(l) > s1: l = l - 1: Wend
        If (i <= l) Then s2 = List(i): List(i) = List(l): List(l) = s2: i = i + 1: l = l - 1
    Loop
    If min < l Then qSortStr List, min, l
    If i < max Then qSortStr List, i, max
End Sub
Private Sub look(): For f = 0 To UBound(j): Cells(f + 2, 1) = j(f): Next: End Sub
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.10.2014, 22:59

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

по нажатию кнопки программа вставляет с первого мемо строку с вызываемым номером во второй мемо на первое место
по нажатию кнопки программа вставляет с первого мемо строку с вызываемым номером(номер вводится в...

Открытие второй формы по нажатию на кнопку в первой
Помогите плз, на главной форме есть кнопка, при нажатии на нее должны открыться вторая форма(уже...

Добавление текстбоксов по нажатию клавиши и удаление по нажатию другой кнопки
Всем доброго времени суток. Хотел попросить помощи в написании следующего кода. Кое что набросал,...

Нарисовать домик по нажатию кнопки, и звезду по нажатию на форме
Нарисовать домик по нажатию кнопки и звезду по нажатию на форме


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.