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

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

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.07.2010, 23:01   #1
rick1177
Пользователь
 
Регистрация: 15.02.2010
Сообщений: 59
По умолчанию Работа со строковыми переменными (наверно странный вопрос)

Представим ситуацию, что в ячейке 1, 1 находится некоторое выражение.
Например, "Проверка программы на вшивость".
Что хочется сделать...
Хочется циклом присвоить код каждого символа массиву и создать выражение, где каждый символ будет вида "Chr(...)".

данный пункт задачи достаточно прост...

Заранее приведу написанный код...

Меня интересует подчёркнутая строка.
Что хотелось... Переменной Str_Per_2 присвоилось ранее выражение.
Как сделать так, чтобы переменной Str_Per_3 присваивался результат данного выражения?

Надеюсь понятно.
Только не называйте извращенцем.
Это с пользой делается.

Заранее спасибо.
Изображения
Тип файла: jpg Пример.jpg (99.8 Кб, 131 просмотров)
rick1177 вне форума Ответить с цитированием
Старый 29.07.2010, 23:32   #2
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Я не Кашперовский,по фотографиям не лечу
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 29.07.2010, 23:51   #3
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Хочется циклом присвоить код каждого символа массиву и создать выражение, где каждый символ будет вида "Chr(...)".
Можно использовать такой код:
Код:
Sub test()
    result = String2CharCodes("Проверка программы на вшивость")
    MsgBox result, vbInformation, "Результат обработки строки"
End Sub

Function String2CharCodes(ByVal txt$) As String
    sep = " & "
    For i = 1 To Len(txt)
        charcode = "Chr(" & Asc(Mid(txt, i, 1)) & ")"
        String2CharCodes = String2CharCodes & sep & charcode
    Next i
    String2CharCodes = Mid(String2CharCodes, Len(sep) + 1)
End Function
Цитата:
Как сделать так, чтобы переменной Str_Per_3 присваивался результат данного выражения?
А что понимается под результатом выражения? Исходный текст строки?
Я правильно понял, что надо из текстовой строки
Chr(207) & Chr(240) & Chr(238) & Chr(226) & Chr(229) & Chr(240) & Chr(234)
надо получить исходную строку "проверка"?

Если да, то можно попробовать так:
Код:
Sub test2()
    ' преобразуем строку в коды
    result = String2CharCodes("Проверка")
    ' обратное преобразование - из кодов в строку
    str3 = Application.Evaluate("=" & Replace(result, "CHR", "CHAR", , , vbTextCompare))
    
    MsgBox result, vbInformation, "Результат обработки строки """ & str3 & """"
End Sub
PS: Такой вариант работает только для коротких строк - длина обрабатываемой строки с кодом ограничена 255 символами
(ограничение функции Application.Evaluate для Excel2003)
Если надо обрабатывать более длинные строки - надо искать другой вариант.

PPS: Вопрос спецам: а вы бы что предложили? (парсинг строки не предлагать)
Есть решение в одну строку кода?
Надо преобразовать строку типа этой
Цитата:
Chr(207) & Chr(240) & Chr(238) & Chr(226) & Chr(229) & Chr(240) & Chr(234) & Chr(224) & Chr(32) & Chr(239) & Chr(240) & Chr(238) & Chr(227) & Chr(240) & Chr(224) & Chr(236) & Chr(236) & Chr(251) & Chr(32) & Chr(237) & Chr(224) & Chr(32) & Chr(226) & Chr(248) & Chr(232) & Chr(226) & Chr(238) & Chr(241) & Chr(242) & Chr(252)
в исходную строку "Проверка программы на вшивость"

Последний раз редактировалось EducatedFool; 30.07.2010 в 00:09.
EducatedFool вне форума Ответить с цитированием
Старый 30.07.2010, 06:41   #4
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
Есть решение в одну строку кода?
В отличии от функции Application.Evaluate (для Excel2003), которая ограничена 256 символами, формула рабочего листа справляется со строками до 1024 символов. Это, конечно, не абсолютное решение. Но, можно так:
Код:
[A2].Formula = "=" & Replace([A1], "Chr", "CHAR"): [A2].Value = [A2].Value
Следует обратить внимание, что в данном случае, ограничение накладывается на строку с формулой (ячейка "A2"), в которой символов будет больше, чем в исходной строке. Причем, в англ. версии функция "CHAR" короче, чем в русской "СИМВОЛ". Поэтому, допустимая длина строки в англ. версии Excel будет несколько большей.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 30.07.2010, 10:34   #5
rick1177
Пользователь
 
Регистрация: 15.02.2010
Сообщений: 59
По умолчанию Продолжение...

Уважаемые специалисты, большое спасибо за участие.
Я даже не ожидал столько откликов...
Но проблема по прежнему не решена... (в полном объёме).

Цитата:
Сообщение от doober Посмотреть сообщение
Я не Кашперовский,по фотографиям не лечу
Сударь прав.
И по этой причине прилагаю файл...

Надеюсь на подсказки специалистов.

Да, кстати, поскольку новичок, прошу пояснения ...
Цитата:
Сообщение от EducatedFool Посмотреть сообщение
PPS: Вопрос спецам: а вы бы что предложили? (парсинг строки не предлагать)
Что такое парсинг?
И как в данном случае его делать?
Если можно, то на моём примере с пояснениями?

Спасибо

P.S. Извините за глупый вопрос. Как скопировать текст программного кода так, чтобы при вставке он вместо русских символов не писал кракозябликов всяких?
Вложения
Тип файла: rar Работа со строковой переменной.rar (21.6 Кб, 17 просмотров)

Последний раз редактировалось rick1177; 30.07.2010 в 10:36. Причина: Добавить
rick1177 вне форума Ответить с цитированием
Старый 31.07.2010, 20:42   #6
rick1177
Пользователь
 
Регистрация: 15.02.2010
Сообщений: 59
По умолчанию

Дк я выложил пример....
От Вас можно ждать помощи?
rick1177 вне форума Ответить с цитированием
Старый 31.07.2010, 21:26   #7
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Так надо было?

Цитата:
Введённая переменная - "Проверка программы на вшивость"
Длинна строковой переменной - 30
Новая строка имеет вид - "Проверка_программы_на_вшивость "
Запись строки в виде кода - ChrW (1055) + ChrW (1088) + ChrW (1086) + ChrW (1074) + ChrW (1077) + ChrW (1088) + ChrW (1082) + ChrW (1072) + ChrW (95) + ChrW (1087) + ChrW (1088) + ChrW (1086) + ChrW (1075) + ChrW (1088) + ChrW (1072) + ChrW (1084) + ChrW (1084) + ChrW (1099) + ChrW (95) + ChrW (1085) + ChrW (1072) + ChrW (95) + ChrW (1074) + ChrW (1096) + ChrW (1080) + ChrW (1074) + ChrW (1086) + ChrW (1089) + ChrW (1090) + ChrW (1100)
Возвращённый код - Проверка_программы_на_вшивость
Если да, то вот код:

Код:
Private Sub CommandButton1_Click()
    Dim Str_Per, Str_Per_1, Str_per_2, Str_Per_3 As String
    Dim Mas() As String, txt, n As Long, i As Integer
    Str_Per = ActiveSheet.Cells(1, 1).Value
    ReDim Mas(Len(Str_Per))
    For i = 1 To Len(Str_Per)
        Mas(i) = Mid(Str_Per, i, 1): If Mas(i) = " " Then Mas(i) = "_"
    Next i
    Str_Per_1 = ""
    For i = 1 To Len(Str_Per)
        Str_Per_1 = Str_Per_1 + Mas(i)
        If i <> Len(Str_Per) Then
            Str_per_2 = Str_per_2 & "ChrW (" & AscW(Mas(i)) & ") + "
        Else
            Str_per_2 = Str_per_2 & "ChrW (" & AscW(Mas(i)) & ")"
        End If
    Next i

    ' обратное преобразование - парсинг строки
    For Each txt In Split(Str_per_2, "ChrW (")
        n = Val(txt): If n Then Str_Per_3 = Str_Per_3 & ChrW(n)
    Next

    MsgBox ("Введённая переменная - " & Chr(34) & Str_Per & Chr(34) & vbCrLf & _
            "Длинна строковой переменной - " & Len(Str_Per) & vbCrLf & _
            "Новая строка имеет вид - " & Chr(34) & Str_Per_1 & Chr(34) & vbCrLf & _
            "Запись строки в виде кода - " & Str_per_2 & vbCrLf & _
            "Возвращённый код - " & Str_Per_3)
End Sub
Цитата:
Как скопировать текст программного кода так, чтобы при вставке он вместо русских символов не писал кракозябликов всяких?
Не знаю, про какие кракозябры речь - у меня все отображается нормально.
На всякий случай сделал вариант для Unicode - заменил Chr на ChrW и Asc на AscW

Цитата:
От Вас можно ждать помощи?
Прошу прощения, я впервые в этом году решил посвятить свой выходной семье, и совсем забыл, что обязан срочно доделать ваш макрос.
EducatedFool вне форума Ответить с цитированием
Старый 31.07.2010, 21:46   #8
rick1177
Пользователь
 
Регистрация: 15.02.2010
Сообщений: 59
По умолчанию

Простите, я промахнулся.
Другому человеку писал (тот что не Кашперовский) про помощь.
А Вам большое спасибо.
Ещё раз извините.))))

А не могли бы вы рассказать про выделенный Вами текст в макросе.
1) Что такое Split?
2) Как в переменную txt попадает значение?
3) Что означает выражение n=(Val(txt)?

Я не совсем понимаю суть этих трёх строк.

(Ибо начинающий) Спасибо.
rick1177 вне форума Ответить с цитированием
Старый 31.07.2010, 22:19   #9
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
1) Что такое Split?
Ставим курсор в коде на это слово, и нажимаем F1
После этого внимательно изучаем справку по этой функции.
Если охота почитать то же самое, но на русском, ищем здесь: http://excelvba.ru/books
Цитата:
Сообщение от справочник по Visual Basic Автор: А.Климов
Split(Expression,[Delimiter],[Limit],[Compare] )

Функция Split используется для расщепления строки на субстроки с использованием разделителя субстрок

Функция Split(Expression) возвращает одномерный массив с типом данных Variant(String), содержащий в качестве элементов найденные субстроки
Впредь переписывать содержание справки вам никто не будет.
Изучайте основы самостоятельно - литературы в Интернете полно.

Цитата:
2) Как в переменную txt попадает значение?
Изучаем работу циклов - в частности, конструкции For Each ... Next

Цитата:
3) Что означает выражение n=(Val(txt)?
Опять же, читаем справку по функции Val
Цитата:
Val(String)
Функция Val(Value) служит для преобразования аргумента в числовой тип данных. Функция Val прекращает чтение строки на первом символе, который она не может распознать в качестве части числа. Символы, которые часто рассматриваются в качестве частей числовых значений, типа знака доллара и запятых, не распознаются. Однако, эта функция распознает префикс основания &O (для восьмеричных) и &H (для шестнадцатеричных значений). Пробелы, символы табуляции и символы перевода строк удаляются из значения параметра. Функция Val распознает в качестве разделителя целой и дробной части только точку (.). Если используются другие разделители целой и дробной частей (например в национальных версиях приложений), следует применять для преобразования строки в число функцию CDbl
EducatedFool вне форума Ответить с цитированием
Старый 31.07.2010, 22:27   #10
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Цитата:
Другому человеку писал (тот что не Кашперовский) про помощь.
Я уже не видел смысла что либо писать после исчерпывающего ответа EducatedFool посте №3
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со строковыми переменными на языке PASCAL бургер Паскаль, Turbo Pascal, PascalABC.NET 1 06.05.2010 08:44
Работа со строковыми данными Anton5 Фриланс 11 16.04.2010 14:48
Работа со строковыми переменными. Babur4iK Помощь студентам 9 11.11.2009 20:54
Нужна помощь со строковыми переменными NightFire Помощь студентам 7 03.03.2009 00:01
Работа со строковыми переменными!!! NightFire Помощь студентам 10 02.03.2009 22:10