vanga srikar reddy Ответов: 2

Как заменить содержимое столбцов конкретными данными


id 	name	sal
0	abc	100
123	bcd	200
ss	cdf	300
0	dfg	400
id	name	sal
0	ghi	500
234	hij	600
sd	ojk	400


вывод такой
id 	name	sal
123	abc	100
123	bcd	200
123	cdf	300
123	dfg	400
234	ghi	500
234	hij	600
234	ojk	400


Что я уже пробовал:

Sub DeleteRowsWithX()

maxRow = ActiveSheet.UsedRange.Rows.Count

For i = 2 To maxRow
    Do While (StrComp(ActiveSheet.Cells(i, 2).Text, "id", vbTextCompare) = 0)
        Rows(i).Select
        Selection.Delete Shift:=xlUp
   Loop
Next

End Sub

Maciej Los

На основании какого условия?!?

Patrice T

Объясните правила трансформации.
В чем проблема в коде ?

vanga srikar reddy

Привет Мацей

Спасибо за ваше решение

но требования изменились
как показано ниже

Ввод

идентификационное имя сал
0 ABC 500
ABC001 BCD 400
0 DEF 400
xyz. ab EFG 200
0 FGH 300
BCD GHI 400
идентификационное имя сал
0 HIJ 300
ABC002 IJK 400
0 Хэллоуин 500
xyz. ab KLM 600
0 LMN 700
CDE MNO 800


требуется вывод как показано ниже

идентификационное имя сал
ABC001 ABC 500
ABC001 BCD 400
ABC001 DEF 400
ABC001 EFG 200
ABC001 FGH 300
ABC001 GHI 400
ABC002 HIJ 300
ABC002 IJK 400
ХЭЛЛОУИН ABC002 500
ABC002 KLM 600
ABC002 LMN 700
ABC002 MNO 800

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

Maciej Los

Не стесняйтесь улучшать мой код.

vanga srikar reddy

Я пытаюсь улучшить код

но размышляйте только о числовых значениях, но не о строковых значениях

можете ли вы pls предоставить код требующий решения

Суб Очистка()
Дим сервер сценариев Windows Как лист
Dim i как целое число
- контекст
Установите wsh = ThisWorkbook.Рабочие листы(1)
- стартовый ряд
i = 2
- до камеры в кол. А не пусто
Делать, пока сервер сценариев Windows.Диапазон("а" & я) &ЛТ;&ГТ; ""
'если ноль-получить значение снизу ячейки
Если wsh. Range ("A" & i) = 0, то
сервер сценариев Windows.Диапазон("а" & я) = выключатели.Диапазон("а" & я).Смещение (RowOffset:=1)
Конец, Если
'если ячейка содержит нечисловое значение и это не "идентификатор" - получите значение из вышеприведенной ячейки
Если LCase(сервер сценариев Windows.Диапазон("а" & я)) &ЛТ;&ГТ; "идентификатор" и числового(сервер сценариев Windows.Диапазон("а" & я)) Затем
сервер сценариев Windows.Диапазон("а" & я) = выключатели.Диапазон("а" & я).Смещение (RowOffset:=-1)
Конец, Если
'if "id" - удалить всю строку
Если LCase(сервер сценариев Windows.Диапазон("а" & я)) = "код" тогда
wsh. Range ("A" & i).Весь день.Удалить xlShiftUp
i = i-1
Конец, Если
i = i + 1
Петля

Конец Подводной Лодки

Maciej Los

Не меняйте свой первоначальный вопрос, если ваши требования были изменены в то же время, потому что все ответы на ваш первоначальный вопрос неверны. Вы должны задать еще один вопрос.

vanga srikar reddy

Ее мое первоначальное требование может вы PLS предоставить код ниже входного

Ввод :

идентификационное имя сал
0 ABC 500
ABC001 BCD 400
0 DEF 400
xyz. ab EFG 200
0 FGH 300
BCD GHI 400
идентификационное имя сал
0 HIJ 300
ABC002 IJK 400
0 Хэллоуин 500
xyz. ab KLM 600
0 LMN 700
CDE MNO 800


требуется вывод как показано ниже

идентификационное имя сал
ABC001 ABC 500
ABC001 BCD 400
ABC001 DEF 400
ABC001 EFG 200
ABC001 FGH 300
ABC001 GHI 400
ABC002 HIJ 300
ABC002 IJK 400
ХЭЛЛОУИН ABC002 500
ABC002 KLM 600
ABC002 LMN 700
ABC002 MNO 800

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

Maciej Los

Нет, это не так! Это новое требование!
Как я уже упоминал. Вы должны опубликовать его как еще один вопрос. Вы должны предоставить подробную информацию о своей проблеме и о том, что вы пробовали до сих пор.

Maciej Los

Вы должны добавить еще одну переменную в качестве счетчика для появления "id". Пусть будет так Dim idcounter As Integer: idcounter = 1 Затем вы должны улучшить этот фрагмент кода:
'if "id" - remove entire row
If LCase(wsh.Range("A" & i)) = "id" Then
wsh.Range("A" & i).EntireRow.Delete xlShiftUp
wsh.Range("A" & i)= wsh.Range("B2") & Right("000" + idocunter,3)
i = i - 1
idcounter = idcounter +1
End If

2 Ответов

Рейтинг:
20

Maciej Los

Попробовать это:

Option Explicit

Sub Cleaning()
    Dim wsh As Worksheet
    Dim i As Integer
    'context
    Set wsh = ThisWorkbook.Worksheets(1)
    'starting row
    i = 2
    'till cell in col. A is not empty
    Do While wsh.Range("A" & i) <> ""
        'if zero - get value from below cell
        If wsh.Range("A" & i) = 0 Then
            wsh.Range("A" & i) = wsh.Range("A" & i).Offset(RowOffset:=1)
        End If
        'if cell contains non-numeric value and it's not a "id" - get value from above cell
        If LCase(wsh.Range("A" & i)) <> "id" And Not IsNumeric(wsh.Range("A" & i)) Then
            wsh.Range("A" & i) = wsh.Range("A" & i).Offset(RowOffset:=-1)
        End If
        'if "id" - remove entire row
        If LCase(wsh.Range("A" & i)) = "id" Then
            wsh.Range("A" & i).EntireRow.Delete xlShiftUp
            i = i - 1
        End If
        i = i + 1
    Loop

End Sub


Результат:
123	abc	100
123	bcd	200
123	cdf	300
234	ghi	500
234	hij	600
234	ojk	400


RedDk

Это здорово. Я считаю, что здесь, в cp, если бы генеральный директор устранил голосование, устранил гостиную и мыльницу и даже устранил группы (потому что я думаю, что это основной источник "мышления" здесь), то было бы больше написания статей и больше ответов на вопросы, подобные OP, задаваемые с такой же программной значимостью и полезной перспективой. Спасибо, мл!

Maciej Los

;) Всегда пожалуйста.
Овации,
Мацей

Рейтинг:
1

Maciej Los


Привет Мацей

Спасибо за ваше решение

но требования изменились
как показано ниже

Ввод :

id name sal
0	ABC	500
ABC001	BCD	400
0	DEF	400
xyz.ab	EFG	200
0	FGH	300
BCD	GHI	400
id name sal
0	HIJ	300
ABC002	IJK	400
0	JKL	500
xyz.ab	KLM	600
0	LMN	700
CDE	MNO	800


требуемый выход как показано ниже
id	name	sal
ABC001	ABC	500
ABC001	BCD	400
ABC001	DEF	400
ABC001	EFG	200
ABC001	FGH	300
ABC001	GHI	400
ABC002	HIJ	300
ABC002	IJK	400
ABC002	JKL	500
ABC002	KLM	600
ABC002	LMN	700
ABC002	MNO	800

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


Sub Cleaning2()
    Dim wsh As Worksheet
    Dim i As Integer ', idcounter As Integer
    'context
    Set wsh = ThisWorkbook.Worksheets(1)
    '
    'idcounter = 1
    'starting row
    i = 2
    'till cell in col. A is not empty
    Do While wsh.Range("A" & i) <> ""
        'if zero - get value from below cell
        If wsh.Range("A" & i) = 0 Then
            wsh.Range("A" & i) = wsh.Range("A" & i).Offset(RowOffset:=1)
        End If
        'if cell contains non-numeric value and it's not a "id" - get value from above cell
        If LCase(wsh.Range("A" & i)) <> "id" And Not IsNumeric(wsh.Range("A" & i)) And Not wsh.Range("A" & i) Like wsh.Range("B2") & "*" Then
            wsh.Range("A" & i) = wsh.Range("A" & i).Offset(RowOffset:=-1)
        End If
        'if "id" - remove entire row
        If LCase(wsh.Range("A" & i)) = "id" Then
            wsh.Range("A" & i).EntireRow.Delete xlShiftUp
            i = i - 1
        End If
        i = i + 1
    Loop
 
End Sub