2015-08-18 7 views
1

У меня есть таблица Excel, называемая «группами», где заголовки являются именами групп. В столбце ниже имя группы являются членами этой конкретной группы.динамические ссылки на таблицы с Excel VBA

В другой таблице у меня есть все имена членов в первом столбце и имена групп в первой строке. И я хочу проверить для каждого имени участника, находится ли он в группе выше.

Чтобы проверить, является ли Тим в группе «ребята» Я мог бы использовать формулу:

=if(countif(groups[guys];"Tim")>0;"yes";"no") 

Но у меня есть командная кнопка «добавить группу», которая открывает UserForm, где я могу войти в новую группу + члены. Имя новой группы вводится в текстовое поле 1. Группа и член добавляются в таблицу групп.

Я хочу обновить вторую таблицу. Я хотел бы сделать следующее:

With Worksheets("Overview").ListObjects("PersonIsInGroupTab") 
    .ListColumns.Add Position:=3 
    .HeaderRowRange(3).Value = TextBox1.Value 
    .DataBodyRange(1, 3).formula= "=if(countif(groups[textbox1.value];""Tim"")>0;""yes"",""no"")" 
End With 

К сожалению, это не работает.

textbox1.value - это название новой группы (также добавленной на вкладку групп).

Есть ли способ, которым я могу сделать эту работу?

EDIT: Я пробовал использовать другой подход, который не сработал, но может помочь ответить на вопрос. В таблице, которая проверяет, является ли определенное лицо членом группы, я начинаю по умолчанию с одной группы. И вручную введите формулу

=if(countif(groups[guys],"Tim")>0,"yes","no") 

в ячейку (в моем случае J4). Когда я добавляю группу «gals» с использованием пользовательской формы, я получаю второй столбец «gals» в моей таблице. Когда я вручную перетаскиваю формулу из ячейки [guys] в ячейку [gals] (K4), она работает так, как я ее хочу. И я получить формулу

=if(countif(groups[gals],"Tim)>0,"yes","no") 

в клетке ГАЛС (К4) Поэтому я полагал, что я мог бы просто сделать это автозаполнение в VBA как часть «добавить группу» рутина. Это код, который я использовал:

Range("groups[guys]").Select 
Selection.AutoFill Destination:=Range("J4:K4"), Type:=xlFillDefault 

Я получил этот код от записи автозаполнения в виде макроса. Но когда я запускаю его, формула в K4 такая же, как в J4, с группами [парни] вместо групп [gals]. I can not do Destination: = Range ("groups [[guys]: [gals]]"), поскольку я хочу, чтобы он работал с любым groupname не только gals.

+0

Есть ли какие-либо конкретные ошибки вы получаете? – DragonSamu

+0

ошибка времени выполнения 1004 в .DataBodyRange (1, 3) .formula = "= if (countif (groups [textbox1.value];" Tim ")> 0;" yes ";" no ")". Полагаю, я не могу ссылаться таким образом. textbox1.value получен из текстового поля в пользовательской форме. Если textbox1.value = group1, тогда будут работать группы [group1]. К сожалению, я не знаю textbox1.value заранее. – Tim

+0

Формула неверна и ее необходимо пересмотреть.(1) заменить сингл «с двойным» «в формуле, подобный так» = if (countif (groups [textbox1.value]; »« Tim »")> 0; "yes" ";" "no" ") «(2) вы используете не английскую версию Excel. Тем не менее, в VBA все формулы должны быть переданы в английском формате. Таким образом, вам нужно заменить символ«; »следующим образом:' '= if (countif (groups [textbox1.value], "Tim" ")> 0," "yes" "," "no" ")" '.Это должно работать лучше. – Ralph

ответ

0

Я смог исправить проблему, написав функцию VBA вместо использования countif. Функция:

Function IsInGroup(group, member As String) As Boolean 
For Each Item In group 
    If Item = member Then 
     IsInGroup = True 
     Exit Function 
    End If 
Next Item 
IsInGroup = False 
End Function 

И я использовал это так:

temparray = ActiveSheet.ListObjects("groups").ListColumns(2).Range 
With Worksheets("Overview").ListObjects("PersonIsInGroupTab") 
    tempmember = .DataBodyRange(1, 1).Value 
    .ListColumns.Add Position:=3 
    .HeaderRowRange(3).Value = TextBox1.Value 
    .DataBodyRange(1, 3).Value = IsInGroup(temparray, tempmember) 
End With 
Смежные вопросы