2013-04-17 2 views
1

Мне нужна помощь в создании макроса, который при стоянии в ячейке A удаляет значение в ячейках, которые я обозначил X ниже (оставляя ячейки с пометкой O). Фактические ячейки могут содержать любое значение.Экземпляр макросов для удаления макросов Excel

A X X X 
X O X X 
X X O X 
X X X O 

Возможно ли это?

+0

Может 'O' быть где-нибудь или будет всегда, как вы показали выше? –

+0

@SiddharthRout Я хочу сохранить диагональ и удалить остальные. – ihatetoregister

+0

Всегда блок 4x4 или нет? Если это так, просто запишите себя ... – AakashM

ответ

4

Попробуйте этот код:

Sub go_sub() 

    Dim tmpRNG As Range 
    Set tmpRNG = ActiveCell.CurrentRegion 'or you could set other range definition here, like Range("A1:d4") 

    Dim cell As Range 
    For Each cell In tmpRNG 
     If cell.Row <> cell.Column Then cell.ClearContents 
    Next cell 
End Sub 

EDIT Код выше работает для текущей области, которая начинается в ячейке A1.

Код ниже работает для любого выбранного региона:

Sub go_sub() 

    Dim tmpRNG As Range 
    Set tmpRNG = Selection 
    Dim tmpOff As Long 

     tmpOff = tmpRNG.Row - tmpRNG.Column 

    Dim cell As Range 
    For Each cell In tmpRNG '.Cells 
     If cell.Row - tmpOff <> cell.Column Then cell.ClearContents 
    Next cell 
End Sub 

Один совета: если у вас есть большое это делает работу с выключателем от обновления экрана, возможно, отключить события тоже.

+0

+ 1 Niceely Done –

+0

Это отлично работает, если диагональ находится в a1, b2, ... но как я могу подсчитать ячейки по отношению к активной ячейке? Также было бы неплохо использовать Set tmpRNG = Selection. – ihatetoregister

+0

Если op хочет начать с «B1», это не будет работать как столбец «row <>» – glh

2

Следующее возьмет вашу текущую ячейку и удалит все, кроме диагоналей. Выберите верхнюю левую ячейку, и все диагонали останутся ... Но мне нравится ответ KazJaw.

Sub go_sub() 

'get the range from current cell to the end 
Lastrow = ActiveSheet.Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row 
Lastcol = ActiveSheet.Cells.Find("*", [A1], , , xlByColumns, xlPrevious).Column 
Set myRange = ActiveSheet.Range(Selection, ActiveSheet.Cells(Lastrow, Lastcol)) 

'set the next cell to keep as current one 
Set Nextcell = selection 

'cycle throug all cells in the range 
For Each cel In myRange 

    'if the cell is to be kept? 
    if cel.address = nextcell.address then 
     'Reset the next cell to save BUT DONE CLEAR THECURRENT CELL 
     set Nextcell = Nextcell.offset(1,1) 
    Else 
     'clear current cell if not to be saved 
     Cel.clearcontents 
    End if 
Next 
End Sub 

До:

before

После:

after

+0

ваши работы для выбранного диапазона мин работают, если вы выбираете первую ячейку только – glh

+1

в конце концов, конкурс хороший, +1 для интересной альтернативы :) надеюсь увидеть вас скоро здесь –

+0

Aggree. Обсуждение, дружеская конкуренция, вдохновение и изобретение порождают знания. Мне нравится ваш ответ лучше, чем у меня, просто не хочу этого говорить;) Увидимся и там. – glh