Змінюй хід війни! Допомагай ЗСУ!

Бесплатные консультации по Excel

🟡 01:57 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • 🟡 01:57 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #81
Вам ответили как сделать текстовой формат:
ActiveSheet.Range("A1").NumberFormat = "@"

Вам ответили как сделать текстовой формат:
ActiveSheet.Range("A1").NumberFormat = "@"

Повторю еще раз: Пользуясь только средствами ВБА мне необходимо сделать так, что бы ячейка которая имеет не текстовый тип стала текстовой.Тот же фонарь :( Нужно сделать так что бы поменялся форат ячейки, тогда все заработает.
Ответ:
ActiveSheet.Range("A1").NumberFormat = "@"
 
  • 🟡 01:57 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #82
Да, открыл новый лист и действительно ActiveSheet.Range("A1").NumberFormat = "@" для VBA не работает, а если вручную изменить формат, то Characters работает и без скобок. NumberFormat изменяет не то, что хранится в ячейке, а то, что видит пользователь. Например формулы все равно видят число.
Если исходить из
Задача: добавить в этот макрос код, который позволит при выполнение макроса получить месседж бокс с "1". Строку MsgBox ActiveSheet.Range("A1").Characters.Text менять нельзя. Тип клетки А1 ручками в Листе тоже.
то, на нам остается только (Ячейка) = " ' " & (Ячейка).
 
  • 🟡 01:57 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #83
Да, открыл новый лист и действительно ActiveSheet.Range("A1").NumberFormat = "@" для VBA не работает,
Что значит не работает?? Следующий код меняет формат ячейки на текстовой..
ActiveSheet.Range("A1").NumberFormat = "@"
 
  • 🟡 01:57 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #84
Что значит не работает?? Следующий код меняет формат ячейки на текстовой..
ActiveSheet.Range("A1").NumberFormat = "@"

Меняет формат отображения ячейки для конечного пользователя, но в ячейке остается число. После ActiveSheet.Range("A1").NumberFormat = "@"
опертор ActiveSheet.Range("A1").Characters(2, 1).Font.Bold = True
не делает второй символ жирным, а
MsgBox ActiveSheet.Range("A1").Characters(2, 1).Text
выдает ошибку.
 
  • 🟡 01:57 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #85
В моем файле верхний пример сделан мной, и в этом же виде он мне и нужен.
Я хотел бы заменить только кнопку группировки на ту которая используется в сводной таблице, для того что бы сворачивался-разворачивался только нужный мне диапазон, а не строки на всю ширину. И данные мне нужно вносить в эту же таблицу.
Вот пример таблицы которую я сам смог сделать, ее бы "плюсики" как в сводной таблице значительно улучшили
Вы хотите скрестить бульдога с носорогом, а так не бывает..Ещё раз Вам рекомендую использовать сводную таблицу..
 
  • 🟡 01:57 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #86
Что значит не работает?? Следующий код меняет формат ячейки на текстовой..
ActiveSheet.Range("A1").NumberFormat = "@"

Посмотрел. Действительно меняет вроде как. Но, как написал Nick__name недоменивает... Как будет минутка надо будеть помозговать над этим вопросом.
 
  • 🟡 01:57 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #87
Попробуй ввести в А1 число 123, сделать в другой ячейке на него формулу "=А1", потом преобразовать А1 в дату и сделать "=А1" в следующей ячейке, потом в текст, потом сделать "=А1*2", потом изменить А1 на а123, потом снова на 123 и т.д.

Представь, что есть класс ячейка и есть класс данные.
То, что на самом деле хранится в данных, надежно инкапсулированно внутри класса. Когда ты пытаешься получить данные из этого объекта (с листа или из макроса), Эксель смотрит на то, что там записано, пытается понять в каком формате тебе это нужно и на свое усмотрение выдает тебе это. Один раз это число, другой раз строка, потом вообще может быть дата.
Range, Characters и все остальное относится к классу ячейки, а не к данным. Они заказывают данные, но только если этот движок решит выдать им строку, твой Characters сможет обработать заброс .text. Ты можешь намекнуть классу данных, что ты хочешь получить "123" вместо 123 поставив впереди апостроф или объявив текстовый стиль отображения ячейки и нажав F2 и Enter, но приказать не можешь. Так же как не можешь объявить ячейку только числовой и видеть крестики/недопустимое значение как только введешь туда букву.
 
  • 🟡 01:57 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #88
Эксель генериться не мной. ЗАставить авторов все делать текстовым невозможно.
С добавлением апострофа - фиг его знает, я короче забил и сделал так:

PHP:
try
{
    _variant_t value = ExcelTextRange->GetValue();
    if (value.vt == VT_BSTR)
   {
        try
        {
	Excel::CharactersPtr objCharacters = ExcelTextRange->GetCharacters(&VOptional,&VOptional);
            //Processing of rich text
        }
        catch (...)
        {
	//Processing of rich text error
        }
    }
    else
    {
           //Try to get value of other type
   	CString wsPhrase = ExtractValue(value);
    }
}
catch (...)
{
    //Processing of general Excel errors.
}
 
  • 🟡 01:57 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #89
Шарик, ты балбес (с)
2 - При считываии данных введенных пользователем, есть необходимость обрабатывать форматирование текста, посему значение из клетки осуществляется не путем обращения к свойству клетки (а ели быть точно Range) Value, а через свойство Characters Text.
Sub test()
ActiveSheet.Range("A1").NumberFormat = "@"
MsgBox ActiveSheet.Range("A1").Characters.Text
End Sub
 
  • 🟡 01:57 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #90
Шарик, ты балбес (с)

А вот и не я :)
То был пример, так сказать строчка кода которую минять низзя :)
Text - мне не поможет, так как он не позволит мне считать свойства шрифта для текстового поля.
Короче Characters отбрасывть нельзя. Надо сделать так что бы Characters работал со всеми типами данных в клетке.
 
  • 🟡 01:57 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #91
та я в курсе кто ты :)

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

Разное форматирование в одной ячейке может иметь только текст.
В твоем случае такие ячейки есть?
1.Нет? - используй Text и Font со всем нужным тебе набором свойств, и ешь ртом..
2.Есть? - тогда пользуй Characters, а при его несуществовании используй пункт "адын". А лучче проверяй тип данных в ячейке, и используй соответствующий метод :)

зы. я сомневаюсь, шо кому то делать нех сидеть тыкать отдельные буковки в ячейке.. разве шо тебя подколоть, это думаю может иметь место :D
 
  • 🟡 01:57 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #92
Тут уже я не понял в чем была задача. Считать или записать? Шрифт всей ячейки (ActiveSheet.Range("A1").Font.Name), или шрифт в определенных позициях (ActiveSheet.Range("A1").Characters(2, 1).Font.Name)
Оператор MsgBox ActiveSheet.Range("A1").Characters(2, 1).Font.Name прекрасно возвращает значение как в случае если в ячейке был текст, так и число. Проблемы начинаются только когда предпринимается попытка изменить шрифт нескольких символов из макроса для поля, где, как думает Эксель, хранится число. При этом стояла задача не просто перехватить ошибку он эррором или сообщить экселю что это текст одинарной кавычкой, а сделать это как-то по другому. Мы ж решали именно эту экстравагандную задачу, правда?

я короче забил и сделал так:

Ничего не понял. Можно человеческим языком, как ты объяснил Экселю, что 12345 это текст?
 
  • 🟡 01:57 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #93
Эксель ниче не "думает". перестаньте продолжать нести ересь.
 
  • 🟡 01:57 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #94
Characters имеет место использоваться, когда частям текста в одной ячейке нужно придать разное форматирование, во всех остальных случаях - это как жевать жопой.
Разное форматирование в одной ячейке может иметь только текст.
В твоем случае такие ячейки есть?
зы. я сомневаюсь, шо кому то делать нех сидеть тыкать отдельные буковки в ячейке.. разве шо тебя подколоть, это думаю может иметь место :D
Не поверишь, но это как раз мой случай. :D

1.Нет? - используй Text и Font со всем нужным тебе набором свойств, и ешь ртом..
2.Есть? - тогда пользуй Characters, а при его несуществовании используй пункт "адын". А лучче проверяй тип данных в ячейке, и используй соответствующий метод :)

Ну я написал как я решил эту проблему выше.
Вот так:
try
{
_variant_t value = ExcelTextRange->GetValue();
if (value.vt == VT_BSTR)
{
try
{
Excel::CharactersPtr objCharacters = ExcelTextRange->GetCharacters(&VOptional,&VOptional);
//Processing of rich text
}
catch (...)
{
//Processing of rich text error
}
}
else
{
//Try to get value of other type
CString wsPhrase = ExtractValue(value);
}
}
catch (...)
{
//Processing of general Excel errors.
}
Это почти твой вариант. Он рабочий. Но хотелось бы сделать все единообразно. Но если другого пути нет - значит останеться так.

Тут уже я не понял в чем была задача. Считать или записать? Шрифт всей ячейки (ActiveSheet.Range("A1").Font.Name), или шрифт в определенных позициях (ActiveSheet.Range("A1").Characters(2, 1).Font.Name)
Оператор MsgBox ActiveSheet.Range("A1").Characters(2, 1).Font.Name прекрасно возвращает значение как в случае если в ячейке был текст, так и число. Проблемы начинаются только когда предпринимается попытка изменить шрифт нескольких символов из макроса для поля, где, как думает Эксель, хранится число. При этом стояла задача не только перехватить ошибку он эррором или сообщить экселю что это текст одинарной кавычкой, а сделать это как-то по другому. Мы ж решали именно эту экстравагандную задачу, правда?
Мне надо считывать. Я ничего не меняю.

Ничего не понял. Можно человеческим языком как ты объяснил Экселю, что 12345 это текст?
Это С++ и диспачнутая обертка на ВБА :)
Я никак не объясняю что мне нужен текст. Я просто получая значение клетки в инварианте (В С++ это _variant_t, как в бейсике не знаю), смотрю по его типу - если тип текстовый, то обращаюсь к chfracters и хендлю форматирование, иначе просто конвертирую в текст.
 
  • 🟡 01:57 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #95
Мне надо считывать. Я ничего не меняю.

Почему ж тогда взникают ошибки?
MsgBox ActiveSheet.Range("A1").Characters(2, 1).Font.Name корректно выдает название шрифта в любом случае, даже если в ячейке число.

Эксель ниче не "думает". перестаньте продолжать нести ересь.

Попробуй ввести в А1 число 12345, потом сделать второй символ жирным и нажат Enter. Потом проделать это же для "абсде".
Есть данные хранящиеся в ячейке (причем Эксель на свое усмотрение определяет какой их тип в данный момент больше подходит пользователю, т.е. думает и решает что это, текст или число как в примере выше), а есть формат отображения этих данных который звисит от того, какой тип данных в данный момент им присвоил Эксель.
 
  • 🟡 01:57 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #96
Почему ж тогда взникают ошибки?
MsgBox ActiveSheet.Range("A1").Characters(2, 1).Font.Name корректно выдает название шрифта в любом случае, даже если в ячейке число.

Намекаешь на то, что текст можно брать из поля текст, а свойства из чарактерс? Интересная идея :)
 
  • 🟡 01:57 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #97
:рл:
вы нашли друг друга :D

1. если содержание ячейки не текстовая строка, то
Range("A1").Characters(пофиг, пофиг).Font.Name = Range("A1").Font.Name всегда:D
И если использовать в этом случае .Characters просто "дурной тон" и дополнительное машинное время, то перебирать символы с заведомо одинаковым форматированием -:рл:

2. Преобразованное в текст .Value ячейки не соответствует отображаемому значению .Text

3. Так, на всякий случай...
.Text не имеет форматирования :D
 
Останнє редагування:
  • 🟡 01:57 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #98
:рл:
вы нашли друг друга :D

1. если содержание ячейки не текстовая строка
Range("A1").Characters(пофиг, пофиг).Font.Name = Range("A1").Font.Name

2. Преобразованное в текст .Value ячейки не соответствует отображаемому значению .Text

:D Поясню еще раз. Задачу считывания полей я уже решил. Но меня не устраивал разошерстый подход к разным типам данных. Учитывая то, что большинство данных это текст в котором хоть каждая буква может иметь свое собственное форматирование, то считывание с помощью Characters для текста является мондаторным. Дабы убрать кейс по типу хотел научится считывать все только с помощью Characters. Но походу это невозможно. Значит останется так как есть через кейс.
 
  • 🟡 01:57 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #99
Дабы убрать кейс по типу хотел научится считывать все только с помощью Characters. Но походу это невозможно. Значит останется так как есть через кейс.
Ну я знаю, что ты всегда и везде рогом упираешься, потому повторюсь:
2. Преобразованное в текст .Value ячейки не соответствует отображаемому значению .Text
 
  • 🟡 01:57 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #100
Назад
Зверху Знизу