Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Числа отображаются текстом, как исправить - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Числа отображаются текстом, как исправить (Макросы/Sub)
Числа отображаются текстом, как исправить
t330 Дата: Воскресенье, 29.09.2019, 15:11 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 147
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Всем привет!

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

Пример кода во вложении:
Нужно запустить процедуру Test , ввести в текстбокс число 10 и нажать кнопку exit.

На картинке во втором столбце отображены числа из массива сформированного на основе данных из текстбокса (см. строка 10) . Эти данные перед выводом на лист были отформатированы , чтобы был формат 0,00 (см строку 20)
И в итоге , во втором столбце получился текст в формате чисел с 2мя знаками после запятой, а не сами числа... А нужны именно числа.

Заранее спасибо!

[vba]
Код


    Option Explicit
    
    Private Sub CommandButton1_Click()
    Call sheetform
    Unload Me
    End Sub
    
    Sub test() 'Заполняем массив случайными числами из текстбокса
    ReDim arrtest(1 To Val(Tb1.Text), 1 To 2)
    
    For i = 1 To UBound(arrtest, 1)
         j = 1
            arrtest(i, j) = i ' номер итерации
10         arrtest(i, j + 1) = Tb1.Value * 99 * Rnd ' случайное число полученное умножением числа введенного в текстбоксе на генератор
     Next i
    End Sub
    
    ' Выводим данные массива arrtest на новый лист после нажатия кнопки exit
    
    Sub sheetform()
    Application.ScreenUpdating = False
    
    'Создаем новый лист с помощью объектной переменной (в этом случае новый лист создается строго перед активным листом и нигде больше)
    
    Dim SheetTest As Worksheet
    Dim Celltest As Range
    Dim currow As Integer ' переменная для счетчика строк
    
    currow = 1
    
    Set SheetTest = Worksheets.Add
        SheetTest.Name = "test" & Sheets.Count
        Windows.Item(SheetTest.Parent.Name).DisplayGridlines = False ' убираем сетку
        
    'вставляем названия ячеек на созданный лист
    ' Заголовки столбцов
        SheetTest.Cells(currow, 1) = "№ Периода"
        SheetTest.Cells(currow, 2) = "Тестовое случайное значение"
    
    Call test ' вызываем процедуру заполнения массива arrtest случайными числами
    
    ' Заполняем лист данными из массива arrtest, куда мы предварительно внесли все расчетные значения ,ячейки таблицы
    For i = 1 To UBound(arrtest, 1)
        For j = 1 To UBound(arrtest, 2)
            SheetTest.Cells(currow + i, j) = arrtest(i, j)
        Next j
    Next i
    
20   ' Здесь форматируем второй столбец со случайными данными в формат чисел с двумя знаками после запятой.
    For Each Celltest In Range(Cells(currow + 1, UBound(arrtest, 2)), Cells(currow + 1 + UBound(arrtest, 1), UBound(arrtest, 2)))
           Celltest.Value = Format(Celltest.Value, "#,##0.00") ' форматируем ячейки в формат 0.00
    Next
    
    End Sub

[/vba]

К сообщению приложен файл: 1093392.xlsm (57.4 Kb)
 
Ответить
СообщениеВсем привет!

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

Пример кода во вложении:
Нужно запустить процедуру Test , ввести в текстбокс число 10 и нажать кнопку exit.

На картинке во втором столбце отображены числа из массива сформированного на основе данных из текстбокса (см. строка 10) . Эти данные перед выводом на лист были отформатированы , чтобы был формат 0,00 (см строку 20)
И в итоге , во втором столбце получился текст в формате чисел с 2мя знаками после запятой, а не сами числа... А нужны именно числа.

Заранее спасибо!

[vba]
Код


    Option Explicit
    
    Private Sub CommandButton1_Click()
    Call sheetform
    Unload Me
    End Sub
    
    Sub test() 'Заполняем массив случайными числами из текстбокса
    ReDim arrtest(1 To Val(Tb1.Text), 1 To 2)
    
    For i = 1 To UBound(arrtest, 1)
         j = 1
            arrtest(i, j) = i ' номер итерации
10         arrtest(i, j + 1) = Tb1.Value * 99 * Rnd ' случайное число полученное умножением числа введенного в текстбоксе на генератор
     Next i
    End Sub
    
    ' Выводим данные массива arrtest на новый лист после нажатия кнопки exit
    
    Sub sheetform()
    Application.ScreenUpdating = False
    
    'Создаем новый лист с помощью объектной переменной (в этом случае новый лист создается строго перед активным листом и нигде больше)
    
    Dim SheetTest As Worksheet
    Dim Celltest As Range
    Dim currow As Integer ' переменная для счетчика строк
    
    currow = 1
    
    Set SheetTest = Worksheets.Add
        SheetTest.Name = "test" & Sheets.Count
        Windows.Item(SheetTest.Parent.Name).DisplayGridlines = False ' убираем сетку
        
    'вставляем названия ячеек на созданный лист
    ' Заголовки столбцов
        SheetTest.Cells(currow, 1) = "№ Периода"
        SheetTest.Cells(currow, 2) = "Тестовое случайное значение"
    
    Call test ' вызываем процедуру заполнения массива arrtest случайными числами
    
    ' Заполняем лист данными из массива arrtest, куда мы предварительно внесли все расчетные значения ,ячейки таблицы
    For i = 1 To UBound(arrtest, 1)
        For j = 1 To UBound(arrtest, 2)
            SheetTest.Cells(currow + i, j) = arrtest(i, j)
        Next j
    Next i
    
20   ' Здесь форматируем второй столбец со случайными данными в формат чисел с двумя знаками после запятой.
    For Each Celltest In Range(Cells(currow + 1, UBound(arrtest, 2)), Cells(currow + 1 + UBound(arrtest, 1), UBound(arrtest, 2)))
           Celltest.Value = Format(Celltest.Value, "#,##0.00") ' форматируем ячейки в формат 0.00
    Next
    
    End Sub

[/vba]


Автор - t330
Дата добавления - 29.09.2019 в 15:11
bmv98rus Дата: Воскресенье, 29.09.2019, 15:43 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4107
Репутация: 768 ±
Замечаний: 0% ±

Excel 2013/2016
Вам нужно именно в таком формате или две значащих после запятой? Если последнее
[vba]
Код
Celltest.Value = Round(Celltest.Value, 2)
[/vba]


Замечательный Временно просто медведь , процентов на 20.
 
Ответить
СообщениеВам нужно именно в таком формате или две значащих после запятой? Если последнее
[vba]
Код
Celltest.Value = Round(Celltest.Value, 2)
[/vba]

Автор - bmv98rus
Дата добавления - 29.09.2019 в 15:43
krosav4ig Дата: Воскресенье, 29.09.2019, 15:46 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
[vba]
Код
Option Explicit
    
Private Sub CommandButton1_Click()
    Call sheetform
    Unload Me
End Sub
    
Sub test(ByRef arrtest#())  'Заполняем массив случайными числами из текстбокса
    ReDim arrtest(1 To Val(Tb1.Text), 1 To 2)
    
    For i = 1 To UBound(arrtest, 1)
        j = 1
        arrtest(i, j) = i ' номер итерации
        arrtest(i, j + 1) = Round(Tb1.Value * 99 * Rnd, 2) ' случайное число полученное умножением числа введенного в текстбоксе на генератор
    Next i
End Sub
    
' Выводим данные массива arrtest на новый лист после нажатия кнопки exit
    
Sub sheetform()
    Application.ScreenUpdating = False
    
    'Создаем новый лист с помощью объектной переменной (в этом случае новый лист создается строго перед активным листом и нигде больше)
    
    Dim SheetTest As Worksheet
    Dim Celltest As Range
    Dim currow As Integer ' переменная для счетчика строк
    Dim arrtest#() 'массива случайных чисел
    currow = 1
    
    Set SheetTest = Worksheets.Add
    SheetTest.Name = "test" & Sheets.Count
    Windows.Item(SheetTest.Parent.Name).DisplayGridlines = False ' убираем сетку
        
    'вставляем названия ячеек на созданный лист
    ' Заголовки столбцов
    SheetTest.Cells(currow, 1) = "№ Периода"
    SheetTest.Cells(currow, 2) = "Тестовое случайное значение"
    
    test arrtest ' вызываем процедуру заполнения массива arrtest случайными числами
    
    ' Заполняем лист данными из массива arrtest, куда мы предварительно внесли все расчетные значения ,ячейки таблицы
    With SheetTest.Cells(currow + 1, 1).Resize(UBound(arrtest, 1), UBound(arrtest, 2))
        .Columns(2).NumberFormat = "#,##0.00"
        .Value = arrtest
    End With
End Sub
[/vba]


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
Сообщение[vba]
Код
Option Explicit
    
Private Sub CommandButton1_Click()
    Call sheetform
    Unload Me
End Sub
    
Sub test(ByRef arrtest#())  'Заполняем массив случайными числами из текстбокса
    ReDim arrtest(1 To Val(Tb1.Text), 1 To 2)
    
    For i = 1 To UBound(arrtest, 1)
        j = 1
        arrtest(i, j) = i ' номер итерации
        arrtest(i, j + 1) = Round(Tb1.Value * 99 * Rnd, 2) ' случайное число полученное умножением числа введенного в текстбоксе на генератор
    Next i
End Sub
    
' Выводим данные массива arrtest на новый лист после нажатия кнопки exit
    
Sub sheetform()
    Application.ScreenUpdating = False
    
    'Создаем новый лист с помощью объектной переменной (в этом случае новый лист создается строго перед активным листом и нигде больше)
    
    Dim SheetTest As Worksheet
    Dim Celltest As Range
    Dim currow As Integer ' переменная для счетчика строк
    Dim arrtest#() 'массива случайных чисел
    currow = 1
    
    Set SheetTest = Worksheets.Add
    SheetTest.Name = "test" & Sheets.Count
    Windows.Item(SheetTest.Parent.Name).DisplayGridlines = False ' убираем сетку
        
    'вставляем названия ячеек на созданный лист
    ' Заголовки столбцов
    SheetTest.Cells(currow, 1) = "№ Периода"
    SheetTest.Cells(currow, 2) = "Тестовое случайное значение"
    
    test arrtest ' вызываем процедуру заполнения массива arrtest случайными числами
    
    ' Заполняем лист данными из массива arrtest, куда мы предварительно внесли все расчетные значения ,ячейки таблицы
    With SheetTest.Cells(currow + 1, 1).Resize(UBound(arrtest, 1), UBound(arrtest, 2))
        .Columns(2).NumberFormat = "#,##0.00"
        .Value = arrtest
    End With
End Sub
[/vba]

Автор - krosav4ig
Дата добавления - 29.09.2019 в 15:46
RAN Дата: Воскресенье, 29.09.2019, 18:56 | Сообщение № 4
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Celltest.Value = Format(Celltest.Value, "#,##0.00") ' форматируем ячейки в формат 0.00

Это не правильный ответ.
Правильный
"Заменяем значение ячейки текстом в формате "#,##0.00""


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение
Celltest.Value = Format(Celltest.Value, "#,##0.00") ' форматируем ячейки в формат 0.00

Это не правильный ответ.
Правильный
"Заменяем значение ячейки текстом в формате "#,##0.00""

Автор - RAN
Дата добавления - 29.09.2019 в 18:56
t330 Дата: Понедельник, 30.09.2019, 00:19 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 147
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Всем спасибо!

Пока разбирался с numberfomat предложенной в коде krosav4ig нашел еще одну удобную функцию:

Formatnumber , которую можно просто вставить в мой код вместо функции Format и тоже получится то, что нужно.

п/с
Ошибся. Formatnumber не дает нужный результат... все равно числа получаются как текст


Сообщение отредактировал t330 - Понедельник, 30.09.2019, 03:13
 
Ответить
СообщениеВсем спасибо!

Пока разбирался с numberfomat предложенной в коде krosav4ig нашел еще одну удобную функцию:

Formatnumber , которую можно просто вставить в мой код вместо функции Format и тоже получится то, что нужно.

п/с
Ошибся. Formatnumber не дает нужный результат... все равно числа получаются как текст

Автор - t330
Дата добавления - 30.09.2019 в 00:19
Alex_ST Дата: Понедельник, 30.09.2019, 08:36 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3206
Репутация: 609 ±
Замечаний: 0% ±

2003
Попробуйте так:
[vba]
Код
Sub Repair_Value()   ' в выделенных ячейках исправить экспортированные как текст данные чтобы нормально опознались числа
   Dim rArea As Range
   On Error Resume Next
   ActiveWindow.RangeSelection.SpecialCells(xlCellTypeConstants).Select
   If Err Then Exit Sub
   With Application: .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlManual: End With
   For Each rArea In Selection.Areas
      rArea.FormulaLocal = rArea.FormulaLocal
   Next rArea
   With Application: .ScreenUpdating = True: .EnableEvents = True: .Calculation = xlAutomatic: End With
End Sub
[/vba]



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеПопробуйте так:
[vba]
Код
Sub Repair_Value()   ' в выделенных ячейках исправить экспортированные как текст данные чтобы нормально опознались числа
   Dim rArea As Range
   On Error Resume Next
   ActiveWindow.RangeSelection.SpecialCells(xlCellTypeConstants).Select
   If Err Then Exit Sub
   With Application: .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlManual: End With
   For Each rArea In Selection.Areas
      rArea.FormulaLocal = rArea.FormulaLocal
   Next rArea
   With Application: .ScreenUpdating = True: .EnableEvents = True: .Calculation = xlAutomatic: End With
End Sub
[/vba]

Автор - Alex_ST
Дата добавления - 30.09.2019 в 08:36
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Числа отображаются текстом, как исправить (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!