Перестановки без повторов подойдут? Если да, то как-то так можно [vba]
Код
Function Комбинации(ParamArray ParArr() As Variant) As Variant Application.Volatile False Dim ArrA(), ArrB(), ArrC(), CountArr&, x&, i&, j& CountArr = UBound(ParArr): ReDim ArrB(CountArr), ArrC(CountArr) For i = 0 To CountArr ArrC(i) = ParArr(i).Count: ArrB(i) = ArrC(i) If i > 0 Then ArrB(i) = ArrB(i - 1) * ArrB(i) Next ReDim ArrA(ArrB(CountArr) - 1, CountArr) For i = 0 To ArrB(CountArr) - 1 For j = 0 To CountArr x = 1: If j > 0 Then x = ArrB(j - 1) ArrA(i, j) = ParArr(j).Cells(Int(i / x) Mod ArrC(j) + 1) Next Next Комбинации= ArrA() End Function
[/vba]
Перестановки без повторов подойдут? Если да, то как-то так можно [vba]
Код
Function Комбинации(ParamArray ParArr() As Variant) As Variant Application.Volatile False Dim ArrA(), ArrB(), ArrC(), CountArr&, x&, i&, j& CountArr = UBound(ParArr): ReDim ArrB(CountArr), ArrC(CountArr) For i = 0 To CountArr ArrC(i) = ParArr(i).Count: ArrB(i) = ArrC(i) If i > 0 Then ArrB(i) = ArrB(i - 1) * ArrB(i) Next ReDim ArrA(ArrB(CountArr) - 1, CountArr) For i = 0 To ArrB(CountArr) - 1 For j = 0 To CountArr x = 1: If j > 0 Then x = ArrB(j - 1) ArrA(i, j) = ParArr(j).Cells(Int(i / x) Mod ArrC(j) + 1) Next Next Комбинации= ArrA() End Function
Здравствуйте В стандартный модуль код (взят отсюда) [vba]
Код
Option Compare Database
Function Concatenate(pstrSQL As String, _ Optional pstrDelim As String = ", ") _ As String 'Created by Duane Hookom, 2003 'this code may be included in any application/mdb providing ' this statement is left intact 'example 'tblFamily with FamID as numeric primary key 'tblFamMem with FamID, FirstName, DOB,... 'return a comma separated list of FirstNames 'for a FamID ' John, Mary, Susan 'in a Query 'SELECT FamID, 'Concatenate("SELECT FirstName FROM tblFamMem ' WHERE FamID =" & [FamID]) as FirstNames 'FROM tblFamily '
'======For DAO uncomment next 4 lines======= '====== comment out ADO below ======= 'Dim db As DAO.Database 'Dim rs As DAO.Recordset 'Set db = CurrentDb 'Set rs = db.OpenRecordset(pstrSQL)
'======For ADO uncomment next two lines===== '====== comment out DAO above ====== Dim rs As New ADODB.Recordset rs.Open pstrSQL, CurrentProject.Connection, _ adOpenKeyset, adLockOptimistic Dim strConcat As String 'build return string With rs If Not .EOF Then .MoveFirst Do While Not .EOF strConcat = strConcat & _ .Fields(0) & pstrDelim .MoveNext Loop End If .Close End With Set rs = Nothing '====== uncomment next line for DAO ======== 'Set db = Nothing If Len(strConcat) > 0 Then strConcat = Left(strConcat, _ Len(strConcat) - Len(pstrDelim)) End If Concatenate = strConcat End Function
[/vba] и SQL код запроса [vba]
Код
SELECT * FROM (SELECT СЧ, x1, x2, x3, Concatenate( "SELECT [КОД] FROM [Таблица2] WHERE '"&x1&"' LIKE IIF(xx1 IS NULL OR cStr(xx1)='','%',cStr(xx1)) AND '"&x2&"' LIKE IIF(xx2 IS NULL OR cStr(xx2)='','%',cStr(xx2)) AND '"&x3&"' LIKE IIF(xx3 IS NULL OR cStr(xx3)='','%',cStr(xx3)) ORDER BY КОД" ) AS ИТОГ FROM Таблица1 GROUP BY СЧ, x1, x2, x3 ORDER BY СЧ) AS t1 WHERE ИТОГ<>'';
[/vba]
Здравствуйте В стандартный модуль код (взят отсюда) [vba]
Код
Option Compare Database
Function Concatenate(pstrSQL As String, _ Optional pstrDelim As String = ", ") _ As String 'Created by Duane Hookom, 2003 'this code may be included in any application/mdb providing ' this statement is left intact 'example 'tblFamily with FamID as numeric primary key 'tblFamMem with FamID, FirstName, DOB,... 'return a comma separated list of FirstNames 'for a FamID ' John, Mary, Susan 'in a Query 'SELECT FamID, 'Concatenate("SELECT FirstName FROM tblFamMem ' WHERE FamID =" & [FamID]) as FirstNames 'FROM tblFamily '
'======For DAO uncomment next 4 lines======= '====== comment out ADO below ======= 'Dim db As DAO.Database 'Dim rs As DAO.Recordset 'Set db = CurrentDb 'Set rs = db.OpenRecordset(pstrSQL)
'======For ADO uncomment next two lines===== '====== comment out DAO above ====== Dim rs As New ADODB.Recordset rs.Open pstrSQL, CurrentProject.Connection, _ adOpenKeyset, adLockOptimistic Dim strConcat As String 'build return string With rs If Not .EOF Then .MoveFirst Do While Not .EOF strConcat = strConcat & _ .Fields(0) & pstrDelim .MoveNext Loop End If .Close End With Set rs = Nothing '====== uncomment next line for DAO ======== 'Set db = Nothing If Len(strConcat) > 0 Then strConcat = Left(strConcat, _ Len(strConcat) - Len(pstrDelim)) End If Concatenate = strConcat End Function
[/vba] и SQL код запроса [vba]
Код
SELECT * FROM (SELECT СЧ, x1, x2, x3, Concatenate( "SELECT [КОД] FROM [Таблица2] WHERE '"&x1&"' LIKE IIF(xx1 IS NULL OR cStr(xx1)='','%',cStr(xx1)) AND '"&x2&"' LIKE IIF(xx2 IS NULL OR cStr(xx2)='','%',cStr(xx2)) AND '"&x3&"' LIKE IIF(xx3 IS NULL OR cStr(xx3)='','%',cStr(xx3)) ORDER BY КОД" ) AS ИТОГ FROM Таблица1 GROUP BY СЧ, x1, x2, x3 ORDER BY СЧ) AS t1 WHERE ИТОГ<>'';
1 Вставить кнопку 2 В обработчик нажатия кнопки написать макрос, который будет из показателя 1 вычитать рандомное число от 1 до 10 и прибавлять рандомное число от 1 до 10 к показателю 2 с учетом максимального значения показателей [p.s.]Тыц
1 Вставить кнопку 2 В обработчик нажатия кнопки написать макрос, который будет из показателя 1 вычитать рандомное число от 1 до 10 и прибавлять рандомное число от 1 до 10 к показателю 2 с учетом максимального значения показателей [p.s.]Тыцkrosav4ig
Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Me.[B:B]) Is Nothing Then Exit Sub If IsError(Application.Match(Target, Лист2.Range( _ Target.Offset(, -1)), 0)) Then Exit Sub Dim sh As Worksheet, Name As String * 31 Name = Application.Trim(Target.Offset(, -1) & ", " & Target) On Error Resume Next With Worksheets .Item(Name).Activate If Err = 0 Then Exit Sub .Add(, .Item(.Count)).Name = Name End With End Sub
[/vba]
Можно посредством VBA, В модуль листа пишем [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Me.[B:B]) Is Nothing Then Exit Sub If IsError(Application.Match(Target, Лист2.Range( _ Target.Offset(, -1)), 0)) Then Exit Sub Dim sh As Worksheet, Name As String * 31 Name = Application.Trim(Target.Offset(, -1) & ", " & Target) On Error Resume Next With Worksheets .Item(Name).Activate If Err = 0 Then Exit Sub .Add(, .Item(.Count)).Name = Name End With End Sub
дату с закладкой "Инф_Дата_Монтажа" нужно поставить только в том случае, если закладка "Инф_Тип_ГБО" = "СНГ", иначе оставить пустое место.
подобное условие при слиянии можно сделать 2-мя способами 1 пишем IF MERGEFIELD Инф_Тип_ГБО = "СНГ" MERGEFIELD Инф_Дата_Монтажа "" выделяем этот текст, жмем Ctrl+F9, выделяем MERGEFIELD Инф_Тип_ГБО, жмем Ctrl+F9,выделяем MERGEFIELD Инф_Дата_Монтажа, жмем Ctrl+F9
2 Рассылка>Составление документа и вставка полей>Правила> if...then...else Выбираем поле, оператор:равно, значение:СНГ, Вставить следующий текст:пишем любой текст (например !@#), OK В режиме просмотра кодов полей выделяем "!@#", жмем Рассылка>Составление документа и вставка полей>Вставить поле слияния>Инф_Дата_Монтажа
дату с закладкой "Инф_Дата_Монтажа" нужно поставить только в том случае, если закладка "Инф_Тип_ГБО" = "СНГ", иначе оставить пустое место.
подобное условие при слиянии можно сделать 2-мя способами 1 пишем IF MERGEFIELD Инф_Тип_ГБО = "СНГ" MERGEFIELD Инф_Дата_Монтажа "" выделяем этот текст, жмем Ctrl+F9, выделяем MERGEFIELD Инф_Тип_ГБО, жмем Ctrl+F9,выделяем MERGEFIELD Инф_Дата_Монтажа, жмем Ctrl+F9
2 Рассылка>Составление документа и вставка полей>Правила> if...then...else Выбираем поле, оператор:равно, значение:СНГ, Вставить следующий текст:пишем любой текст (например !@#), OK В режиме просмотра кодов полей выделяем "!@#", жмем Рассылка>Составление документа и вставка полей>Вставить поле слияния>Инф_Дата_Монтажаkrosav4ig
Private Sub Workbook_BeforeClose(Cancel As Boolean) Range("G9,G11,G13,G15,G17,G19,G21,G23,G27,G33,G35,G37,G39,G41,G43,G45,G47,G49,G51,G53,G55,G57").Locked = True Range("G59,G61,G63,G65,G67,G69,G73,G75,G77,G79,G81,G83,G85,G87,G89,G90,G92,G94,G96,G98,G100,G102,G104").Locked = True Range("G108,G110,G112,G114,G116,G118,G120,G122,G124,G126,G128,G130,G132,G134,G136,G138,G140,G142,G145,G147,G149,G151,G153").Locked = True Dim reply As Integer reply = MsgBox("Вы указали план на следующую неделю?", vbYesNo, "Запрос на продолжение") If reply = vbNo Then MsgBox "Укажите плановые задания на следующую неделю" Cancel = True Application.Goto [K9], True 'пользователь оказывается в ячейке K9 ElseIf reply = vbYes Then Exit Sub End If End Sub
[/vba]
Здравствуйте. Если правильно понял [vba]
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean) Range("G9,G11,G13,G15,G17,G19,G21,G23,G27,G33,G35,G37,G39,G41,G43,G45,G47,G49,G51,G53,G55,G57").Locked = True Range("G59,G61,G63,G65,G67,G69,G73,G75,G77,G79,G81,G83,G85,G87,G89,G90,G92,G94,G96,G98,G100,G102,G104").Locked = True Range("G108,G110,G112,G114,G116,G118,G120,G122,G124,G126,G128,G130,G132,G134,G136,G138,G140,G142,G145,G147,G149,G151,G153").Locked = True Dim reply As Integer reply = MsgBox("Вы указали план на следующую неделю?", vbYesNo, "Запрос на продолжение") If reply = vbNo Then MsgBox "Укажите плановые задания на следующую неделю" Cancel = True Application.Goto [K9], True 'пользователь оказывается в ячейке K9 ElseIf reply = vbYes Then Exit Sub End If End Sub