Страницы: 1
RSS
Разделить значение ячейки при помощи макроса (объединить два макроса)
 
Добрый день! можно ли заменить работу пользовательской функции - макросом. Пример во вложение.  
 
Можно ли что бы при изменение ячеек в диапазоне A2:A5000 макрос разбивал текс ячеек на куски по разделителям.  
 
Нашол похожее, но не знаю как объединить два этих макроса.  
 
Function ExtractElement(Txt, n, Separator) As String  
'   Функция выдает n-ый элемент текстовой строки Txt, где  
'   символ Separator используется как разделитель  
   
   Dim Txt1 As String, TempElement As String  
   Dim ElementCount As Integer, i As Integer  
     
   Txt1 = " "  
'   Если в качестве разделителя используется пробел, то убираем лишние  
'   и двойные пробелы  
   If Separator = Chr(32) Then Txt1 = Application.Trim(Txt1)  
     
'   Добавляем разделитель в конец строки (если необходимо)  
   If Right(Txt1, 1) <> Separator Then Txt1 = Txt1 & Separator  
     
'   Начальные значения  
   ElementCount = 0  
   TempElement = ""  
     
'   Извлекаем элемент  
   For i = 1 To Len(Txt1)  
       If Mid(Txt1, i, 1) = Separator Then  
           ElementCount = ElementCount + 1  
           If ElementCount = n Then  
'               Found it, so exit  
               ExtractElement = TempElement  
               Exit Function  
           Else  
               TempElement = ""  
           End If  
       Else  
           TempElement = TempElement & Mid(Txt1, i, 1)  
       End If  
   Next i  
   ExtractElement = ""  
End Function  
 
 
 
 
Option Explicit  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
Dim cc As Range  
Application.ScreenUpdating = False  
Application.EnableEvents = False  
 
For Each cc In Target  
If Not Intersect(cc, Range("A2:A5000")) Is Nothing Then  
With cc(1, 14)  
.Value = IIf(Trim(cc) = "", "", Day(Now))  
.EntireColumn.AutoFit  
End With  
End If  
Next  
 
Application.EnableEvents = True  
Application.ScreenUpdating = True  
 
End Sub  
<EM><STRONG>Файл удален</STRONG> - велик размер - [<STRONG>МОДЕРАТОРЫ</STRONG>]</EM>
 
разделено.  
<EM><STRONG>Файл удален</STRONG> - велик размер - [<STRONG>МОДЕРАТОРЫ</STRONG>]</EM>
 
Спасибо  
Так-то все хорошо работает, но можно ли что бы значения в ячейках в столбце остовались неизменными, (т.е. копировались в другие столбцы и название в своем столбце остовалось прежним)    
И Дата была все таки копировалась из стобца A, а не из текущего времени на компьютере.
 
А так?  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
If Target.Cells.Count > 1 Then Exit Sub  
If Not Intersect(Target, Range("A2:A5000")) Is Nothing Then  
   Dim str() As String  
   str = Split(Replace(Replace(Target.Text, "х", " "), ".", " "))  
   Target.Offset(, 1).Resize(, 6).Value = str  
End If  
End Sub
 
nilem  
Очень здорово, но вот еще бы удалялись значения после того как удаляется значение в Столбце A
 
Ну, так что ли:  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
If Target.Cells.Count > 1 Then Exit Sub  
If Not Intersect(Target, Range("A2:A5000")) Is Nothing Then  
   Dim str() As String  
   str = Split(Replace(Replace(Target.Text, "х", " "), ".", " "))  
   If UBound(str) <> -1 Then  
       Target.Offset(, 1).Resize(, 6).Value = str  
   Else  
       Target.Offset(, 1).Resize(, 6).Value = ""  
   End If  
End If  
End Sub
 
k61 то что нужно ) спасибо)
 
nilem  
А можно ли что бы дата копировалась в 7,8,9 столбец соотвественно ?
 
{quote}{login=taram}{date=22.03.2011 09:09}{thema=}{post}k61 то что нужно ) спасибо){/post}{/quote}  
это не очень то что нужно.  
каждый раз при изменении любой ячейки листа происходит вход в процедуру Worksheet_Change, даже когда сама процедура выполняет запись разделённых зачений. И хотя сразу происходит выход (If Target.Cells.Count > 1 Then Exit Sub) это не красиво.  
"я так думаю" (водитель КРАЗа из х/ф "Мимино")
 
главное что бы работало.  
 
Вот хороший вариант от k61 был, сразу не разобрался в нем.  
жаль что не работает удаление всех ячеек при удаление первой ячейки и нет заполнения при вставке копирование.
 
Вот он.
 
Можно ли в данном макросе сделать так что бы при удаление значения в ячейке A1, удалялись значения во всех следующих ?  
 
 
Private Sub Worksheet_Change(ByVal Target As Range)  
Dim Массив As Variant  
If Target.Cells.Count > 1 Then Exit Sub  
If Not Intersect(Target, Range("A2:A10000")) Is Nothing Then  
Массив = Split(Replace(Target, "х", " "))  
For i = 0 To UBound(Массив)  
 If i <> UBound(Массив) Then  
 Cells(Target.Row, i + 2) = Массив(i)  
 Else  
 Дата = CDate(Массив(i))  
 Cells(Target.Row, 8) = "'" & Day(Дата)  
 Cells(Target.Row, 9) = "'" & Month(Дата)  
 Cells(Target.Row, 10) = "'" & Year(Дата)  
End If  
Next  
End If  
End Sub
 
Пробуйте  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
If Target.Cells.Count > 1 Then Exit Sub  
If Not Intersect(Target, Range("A2:A10000")) Is Nothing Then  
   Dim str() As String  
   str = Split(Replace(Target.Text, "õ", " "))  
   If UBound(str) > 0 Then  
       Target.Next.Resize(, 3).Value = str  
       Target(, 8).Resize(, 3).Value = Array(Day(str(3)), Month(str(3)), Year(str(3)))  
   Else  
       Target.Next.Resize(, 9).Value = ""  
   End If  
End If  
End Sub
 
Раскладка, будь она (с)  
Так правильно:  
str = Split(Replace(Target.Text, "х", " "))
 
советую установить Punto Switcher, в большинстве случаев работает корректно.
 
nilem извиняюсь за то что неправильно написал фразу которую нужно разделить. Нужно "АИМП 152х133 13 01 1988" т.е. дата разделена без точек.    
 
Можно ли приспособить ваш макрос к такой формулировке ?
 
Если пробелы вместо точек, попробуйте заменить строку:  
 
Target(, 8).Resize(, 3).Value = Array(str(3), str(4), str(5))  
 
На всякий случай - формат ячеек Общий.
 
Спасибо nilem. Все отлично работает ))
 
а если конструкция будет "АИМП 152х133 13 01 1988.pdf" можно приспособить для этого словосочетания ?
 
:) Поменяйте эту строку  
 
str = Split(Replace(Replace(Target.Text, "х", " "), ".", " "))
 
Спасибо. То что нужно)))
 
Жалко что не работает когда данный вносяться через копировать-Вставить ячейку(
Страницы: 1
Читают тему
Наверх