Страницы: 1 2 След.
RSS
заменить скопированный из 1С текст на число.
 
Мой бухгалтер методом копи-пасте заносит в экселевский файл значения из 1-с, в виде    
#,###,###.## хотелось бы макрос который пробежав по текущему листу нашел бы подобный формат и преобразовал его в числовой # ### ###,## не трогая при этом остальные числа , тексты и значения. Понятно простой "заменить на" этого сделать не получается. Пример прилагаю. Спасибо
 
{quote}{login=Микки}{date=26.01.2012 01:21}{thema=заменить скопированный из 1С текст на число.}{post} Понятно простой "заменить на" этого сделать не получается. Пример прилагаю. Спасибо{/post}{/quote}Это почему? Меняем сначала запятую на пусто, потом точку на запятую.
 
{quote}{login=Юрий М}{date=26.01.2012 01:30}{thema=Re: заменить скопированный из 1С текст на число.}{post}{quote}{login=Микки}{date=26.01.2012 01:21}{thema=заменить скопированный из 1С текст на число.}{post} Понятно простой "заменить на" этого сделать не получается. Пример прилагаю. Спасибо{/post}{/quote}Это почему? Меняем сначала запятую на пусто, потом точку на запятую.{/post}{/quote}  
Если это сделать по всему листу то испортим и нормальные числа и текст ..
 
Миш, я реагировал на ложное утверждение: "Понятно простой "заменить на" этого сделать не получается". Я даже процитировал его...  
А по всему листу не нужно: выделяем то, что нужно и меняем.
 
{quote}{login=Юрий М}{date=26.01.2012 01:37}{thema=}{post}Миш, я реагировал на ложное утверждение: "Понятно простой "заменить на" этого сделать не получается". Я даже процитировал его...  
А по всему листу не нужно: выделяем то, что нужно и меняем.{/post}{/quote}  
Мне нужен универсальный макрос... я не знаю где на листе расположаться эти крокозябры.  Я специально сформулировал точно ..на ТЕКУЩЕМ листе.
 
{quote}{login=Юрий М}{date=26.01.2012 01:37}{thema=}{post}Миш, я реагировал на ложное утверждение: "Понятно простой "заменить на" этого сделать не получается". Я даже процитировал его...  
А по всему листу не нужно: выделяем то, что нужно и меняем.{/post}{/quote}  
Юра я тебе больше скажу для конкретного столбца макрорекордером записал через "заменить на" , но проблема в другом, мне надо их сначала найти на всем  листе ..а потом их переделать.
 
И как по-твоему макрос поймёт - вот ЭТО трогать, а вот ЭТО нет? Нужен какой-то критерий. Он у тебя есть?
 
И вообще не мешай - я с Соней разговариваю пока. Там дела поважнее - валюта, понимаешь ли...
 
{quote}{login=Юрий М}{date=26.01.2012 01:50}{thema=}{post}И как по-твоему макрос поймёт - вот ЭТО трогать, а вот ЭТО нет? Нужен какой-то критерий. Он у тебя есть?{/post}{/quote}  
Да я описал критерий ###,###,###,###.## этого недостаточно число разрядов разное в файле есть ...  А Соня просто прелесть я тебя понимаю Курс у нее только левый какой-то видимо валюта фальшивая
 
{quote}{login=Микки}{date=26.01.2012 01:58}{thema=Re: }{post}{quote}{login=Юрий М}{date=26.01.2012 01:50}{thema=}{post}И как по-твоему макрос поймёт - вот ЭТО трогать, а вот ЭТО нет? Нужен какой-то критерий. Он у тебя есть?{/post}{/quote}  
Да я описал критерий ###,###,###,###.## этого недостаточно число разрядов разное в файле есть ...  А Соня просто прелесть я тебя понимаю Курс у нее только левый какой-то видимо валюта фальшивая{/post}{/quote}  
Не-а, капуста настоящая - баксовая, и курс нормалек, с оттенком KZ тяньга... ;)
 
Миш, у твоих ячеек не такой формат "###,###,###,###.##". У них обычный общий формат. Грубо говоря, текст. Так что, мне кажется, что если не знать в коком столбце точно находятся эти данные, то сложно будет преобразовать  
 
P.S. Из меня 1С никакой )) я больше по закупкам товара ))
 
{quote}{login=Ластик}{date=26.01.2012 03:14}{thema=}{post}Миш, у твоих ячеек не такой формат "###,###,###,###.##". У них обычный общий формат. Грубо говоря, текст. Так что, мне кажется, что если не знать в коком столбце точно находятся эти данные, то сложно будет преобразовать  
 
P.S. Из меня 1С никакой )) я больше по закупкам товара )){/post}{/quote}  
Нам еще ПРОДАКТ-МЕНЕДЖЕР нужен к слову.    
 
По теме а нельзя нарисовать образцы все возможные от #.## до ###,###,###,###.## и с ними сравнивать только желательно чтоб они были в теле макроса чтоб в книгу персональную пихнуть.  
Значит условия для поиска 1-ячейка, НЕЧИСЛО, и определенный Вид(есть список),  
так не получается или это трудно?
 
Как выхожу из подобной ситуации:  
1. Написал макрос макрорекордером, который пробегается по выделенным ячейкам и заменяет запятую на пусто, точку на запятую.  
Как правило при вставке чисел из 1С, числа расположены таблично, достаточно выделить проблемную область и запустить макрос.  
2. Перед вставкой меняем международные настройки чисел: разделитель целой и дробной части на точку, разделитель ращрядов - на запятую, после вставки востанавливаем использование системных разделителей
 
Макрос можно мопробовать такой (на 90% из макрорекордера):  
Sub Text1C()  
   Dim r As Range  
   Cells.Select  
   Selection.SpecialCells(xlCellTypeConstants, 2).Select  
   With Application  
       .DecimalSeparator = "."  
       .ThousandsSeparator = ","  
       .UseSystemSeparators = False  
   End With  
   For Each r In Selection: r.Value = r.Value: Next r  
   Application.UseSystemSeparators = True  
   [a1].Select
End Sub
 
Миш, сбрось один листик со смешанными данными для тренировки.
 
Михаил, если предположить, что на листе только искомые ячейки будут содержать одну-единственную точку и при этом остальные символы будут только запятые и цифры - то может быть такой вариант (наверняка, можно сделать и попроще, но мне с моим небольшим опытом такой вариант первым пришел в голову):  
 
Dim r As Range, rst As Range, li&, tr As Boolean  
With New Collection  
For li = 0 To 9  
.Add 0, CStr(li)  
Next  
.Add 0, "."  
.Add 0, ","  
 
For Each r In ActiveSheet.UsedRange  
If InStr(1, r.Value, ".") > 0 And InStr(1, r.Value, ".") = InStrRev(r.Value, ".") Then  
 tr = True  
   
 For li = 1 To Len(r.Value)  
  On Error Resume Next  
  If IsEmpty(.Item(Mid(r.Value, li, 1))) Then  
  tr = False  
  End If  
  On Error GoTo 0  
 Next li  
   
 If tr Then  
  r.Value = Val(Replace(r.Value, ",", ""))  
  r.NumberFormat = "#,##0.00"  
 End If  
End If  
Next r  
End With
 
Есть опасность, что попадутся ячейки, где точка есть, но это "не наши" ячейки :-)
 
Пользуйтесь  
Надеюсь текста "1 штука" нет.  
Sub qqq()  
   Dim cll As Object  
   For Each cll In ActiveSheet.UsedRange.Cells  
       If Not IsNumeric(cll) Then  
           If IsNumeric(Left(cll, 1)) Then  
               cll.NumberFormat = "#,##0.00"  
               cll.Value = Val(Replace(Replace(cll.Value, ",", ""), ",", "."))  
           End If  
       End If  
   Next  
End Sub
 
Лучше так  
       If Not IsNumeric(cll) And Not IsDate(cll) Then
 
{quote}{login=RAN}{date=26.01.2012 08:00}{thema=}{post}Надеюсь текста "1 штука" нет.{/post}{/quote}Зато найдётся 1 кг. :-)
 
Оптимист!-:)
 
Выкинул лишнее из макроса, записанного макрорекордером:  
Sub Text1C()  
Dim r As Range  
With Application  
   .DecimalSeparator = "."  
   .ThousandsSeparator = ","  
   .UseSystemSeparators = False  
End With  
For Each r In Cells.SpecialCells(xlCellTypeConstants, 2)  
   If r = " " Then r.ClearContents Else r = r.Value  
Next r  
Application.UseSystemSeparators = True  
End Sub  
 
PS: Как правило при импорте данных из 1С вместо пустых ячеек находятся одиночные пробелы, их нужно удалять, а то мешают дальнейшим расчетам
 
Смотря к каком контексте данные: если в ячейке только число (подобие числа) то значительно проще, если венегрет, ай-яй-яй. Нужен реальный пример. На первый взгляд, регулярный выражения должны с этим справиться.
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Так я и просил:  
{quote}{login=Юрий М}{date=26.01.2012 06:12}{thema=}{post}Миш, сбрось один листик со смешанными данными для тренировки.{/post}{/quote}
 
Спасибо всем за сочуствие и участие отсутствовал .... счас все протестю и листик кину.
 
{quote}{login=Юрий М}{date=26.01.2012 08:57}{thema=Re: }{post}Так я и просил:  
{quote}{login=Юрий М}{date=26.01.2012 06:12}{thema=}{post}Миш, сбрось один листик со смешанными данными для тренировки.{/post}{/quote}{/post}{/quote}  
Обещанный листик
 
{quote}{login=RAN}{date=26.01.2012 08:03}{thema=}{post}Лучше так  
       If Not IsNumeric(cll) And Not IsDate(cll) Then{/post}{/quote}  
Не сработало на тестовом листе высыпался тут  
If Not IsNumeric(cll) And Not IsDate(cll) Then  
!!!!!If IsNumeric(Left(cll, 1)) Then
 
{quote}{login=Grin23}{date=26.01.2012 06:12}{thema=}{post}Михаил, если предположить, что на листе только искомые ячейки будут содержать одну-единственную точку и при этом остальные символы будут только запятые и цифры - то может быть такой вариант (наверняка, можно сделать и попроще, но мне с моим небольшим опытом такой вариант первым пришел в голову):  
 
Dim r As Range, rst As Range, li&, tr As Boolean  
With New Collection  
For li = 0 To 9  
.Add 0, CStr(li)  
Next  
.Add 0, "."  
.Add 0, ","  
 
For Each r In ActiveSheet.UsedRange  
If InStr(1, r.Value, ".") > 0 And InStr(1, r.Value, ".") = InStrRev(r.Value, ".") Then  
 tr = True  
   
 For li = 1 To Len(r.Value)  
  On Error Resume Next  
  If IsEmpty(.Item(Mid(r.Value, li, 1))) Then  
  tr = False  
  End If  
  On Error GoTo 0  
 Next li  
   
 If tr Then  
  r.Value = Val(Replace(r.Value, ",", ""))  
  r.NumberFormat = "#,##0.00"  
 End If  
End If  
Next r  
End With{/post}{/quote}  
 
Тоже на этой строке :  
For Each r In ActiveSheet.UsedRange  
!!! If InStr(1, r.Value, ".") > 0 And InStr(1, r.Value, ".") = InStrRev(r.Value, ".") Then
 
{quote}{login=MCH}{date=26.01.2012 08:51}{thema=}{post}Выкинул лишнее из макроса, записанного макрорекордером:  
Sub Text1C()  
Dim r As Range  
With Application  
   .DecimalSeparator = "."  
   .ThousandsSeparator = ","  
   .UseSystemSeparators = False  
End With  
For Each r In Cells.SpecialCells(xlCellTypeConstants, 2)  
   If r = " " Then r.ClearContents Else r = r.Value  
Next r  
Application.UseSystemSeparators = True  
End Sub  
 
PS: Как правило при импорте данных из 1С вместо пустых ячеек находятся одиночные пробелы, их нужно удалять, а то мешают дальнейшим расчетам{/post}{/quote}  
 
Сработал там где есть одна запятая в числе т.е числа до 999 999.99  
очтальные не тронул
 
{quote}{login=Микки}{date=27.01.2012 10:53}{thema=Re: }{post}  
Сработал там где есть одна запятая в числе т.е числа до 999 999.99  
очтальные не тронул{/post}{/quote}  
Михаил, мы точно говорим о числах из 1С в формате "#,##0.00", а то в числах более милиона перед запятой разделяющей миллионы и тысячи стоит пробел.  
 
более универсально должно работать так:  
 
Sub Text1C()  
   'Преобразование чисел из 1С в виде #,##0.00 в формат # ##0,00  
   Dim r As Range  
   With Application  
       .DecimalSeparator = "."  
       .ThousandsSeparator = ","  
       .UseSystemSeparators = False  
   End With  
   For Each r In Cells.SpecialCells(xlCellTypeConstants, 2)  
       If r = " " Then r.ClearContents Else r = Replace(r.Value, " ,", ",")  
   Next r  
   Application.UseSystemSeparators = True  
End Sub
Страницы: 1 2 След.
Читают тему
Наверх