=ArrayFormula(QUERY(SPLIT(TRANSPOSE(SPLIT(TEXTJOIN("|",1,If(ROW(A8:A15)-LOOKUP(ROW(A8:A15),IF(A8:A15<>"",ROW(A8:A15)),ROW(A8:A15))<3,if(B8:I15<>"",LOOKUP(ROW(A8:A15),IF(A8:A15<>"",ROW(A8:A15)),A8:A15)&":"&IFERROR(VLOOKUP(B8:I15,I18:J22,2,),),""),"")),"|")),":"),"select Col1,sum(Col2) group by Col1 label Col1 'Пациент', sum(Col2) 'Сумма'",0))
[/vba]или[vba]
Код
=ArrayFormula(QUERY(SPLIT(TRANSPOSE(SPLIT(TEXTJOIN("|",1,If(ROW(A8:A15)-LOOKUP(ROW(A8:A15),IF(A8:A15<>"",ROW(A8:A15)),ROW(A8:A15))<3,if(B8:I15<>"",LOOKUP(ROW(A8:A15),IF(A8:A15<>"",ROW(A8:A15)),A8:A15)&":"&B8:I15,""),"")),"|")),":"),"select Col1,Col2,count(Col2) group by Col1,Col2 label Col1 'Пациент', Col2 'Процедура', count(Col2) 'Количество'",0))
=ArrayFormula(QUERY(SPLIT(TRANSPOSE(SPLIT(TEXTJOIN("|",1,If(ROW(A8:A15)-LOOKUP(ROW(A8:A15),IF(A8:A15<>"",ROW(A8:A15)),ROW(A8:A15))<3,if(B8:I15<>"",LOOKUP(ROW(A8:A15),IF(A8:A15<>"",ROW(A8:A15)),A8:A15)&":"&IFERROR(VLOOKUP(B8:I15,I18:J22,2,),),""),"")),"|")),":"),"select Col1,sum(Col2) group by Col1 label Col1 'Пациент', sum(Col2) 'Сумма'",0))
[/vba]или[vba]
Код
=ArrayFormula(QUERY(SPLIT(TRANSPOSE(SPLIT(TEXTJOIN("|",1,If(ROW(A8:A15)-LOOKUP(ROW(A8:A15),IF(A8:A15<>"",ROW(A8:A15)),ROW(A8:A15))<3,if(B8:I15<>"",LOOKUP(ROW(A8:A15),IF(A8:A15<>"",ROW(A8:A15)),A8:A15)&":"&B8:I15,""),"")),"|")),":"),"select Col1,Col2,count(Col2) group by Col1,Col2 label Col1 'Пациент', Col2 'Процедура', count(Col2) 'Количество'",0))
a=координаты верхней границы 1 фигуры b=координаты нижней границы 1 фигуры с=координаты левой границы 1 фигуры d=координаты правой границы 1 фигуры e=координаты верхней границы 2 фигуры f=координаты нижней границы 2 фигуры g=координаты левой границы 2 фигуры h=координаты правой границы 2 фигуры i=application.median(a,b,e,f) j=application.median(c,d,g,h) If i < a And i > b And j > c And j < d then Надвинуто=true
[/vba]
[vba]
Код
a=координаты верхней границы 1 фигуры b=координаты нижней границы 1 фигуры с=координаты левой границы 1 фигуры d=координаты правой границы 1 фигуры e=координаты верхней границы 2 фигуры f=координаты нижней границы 2 фигуры g=координаты левой границы 2 фигуры h=координаты правой границы 2 фигуры i=application.median(a,b,e,f) j=application.median(c,d,g,h) If i < a And i > b And j > c And j < d then Надвинуто=true
Нана123, теги ( bb-коды) - это инструмент для форматирования текста поста и внедрения различных элементов в сообщения (графика, видео, ссылки). Видео в первом посте не заметили? ссылка на то видео - тег URL . а вот это же видео, вставленное тегом video Тут также приведены примеры использования тегов. При написании этого поста я использовал 1 тег b, 3 тега url, 1 тег img, 1 тег video
Нана123, теги ( bb-коды) - это инструмент для форматирования текста поста и внедрения различных элементов в сообщения (графика, видео, ссылки). Видео в первом посте не заметили? ссылка на то видео - тег URL . а вот это же видео, вставленное тегом video Тут также приведены примеры использования тегов. При написании этого поста я использовал 1 тег b, 3 тега url, 1 тег img, 1 тег videokrosav4ig
Пожалуйста Кстати, не так давно наткнулся на тему test, меня заинтересовали пост #13 и #14. Возник вопрос, у нас реализованы bb-коды таблиц? Если да, то какой синтаксис (тег самой таблицы, теги для tr, td/th, есть ли colspan/rowspan). есть мысли по генерации bb-кодов при вставке скопированной таблицы (из excel/word/веб-страницы) из буфера обмена.
Пожалуйста Кстати, не так давно наткнулся на тему test, меня заинтересовали пост #13 и #14. Возник вопрос, у нас реализованы bb-коды таблиц? Если да, то какой синтаксис (тег самой таблицы, теги для tr, td/th, есть ли colspan/rowspan). есть мысли по генерации bb-кодов при вставке скопированной таблицы (из excel/word/веб-страницы) из буфера обмена.krosav4ig
dim фигура2 as shape with activesheet with .shapes("Овал 1") 'вычисление координат границ Овала 1 end with 'проход циклом по объектам в коллекции shapes for each фигура2 in .shapes if фигура2.name<>"Овал 1" then 'вычисление координат границ фигуры2 и пересечения с овалом endif next end with
[/vba]
[vba]
Код
dim фигура2 as shape with activesheet with .shapes("Овал 1") 'вычисление координат границ Овала 1 end with 'проход циклом по объектам в коллекции shapes for each фигура2 in .shapes if фигура2.name<>"Овал 1" then 'вычисление координат границ фигуры2 и пересечения с овалом endif next end with
Sub Макрос1() Dim фигура2 As Shape With ActiveSheet With .Shapes("Овал 1") 'вычисление координат границ Овала 1 'Здесь контекст- ActiveSheet.Shapes("Овал 1") , поэтому следующие 4 строчки отрабатывают корректно a = .Top b = .Top + .Height c = .Left d = .Left + .Width End With 'проход фиклом по объектам в коллекции shapes For Each фигура2 In .Shapes If фигура2.Name <> "Овал 1" Then 'вычисление координат границ фигуры2 и пересечения с овалом 'а вот здесь контекст - activesheet и следующие 4 не будут работать (в классе worksheet нету свосйтв top и left) 'чтобы работало нужно или обернуть их в конструкцию with фигура2 ... end with, или писать e=фигура2.top e = .Top f = .Top + .Height g = .Left h = .Left + .Width i = Application.Median(a, b, e, f) j = Application.Median(c, d, g, h) If i < a And i > b And j > c And j < d Then Надвинуто = True End If Next End With End Sub
[/vba]
SergVrn, вместо sh.name нужно фигура2.name [vba]
Код
Sub Макрос1() Dim фигура2 As Shape With ActiveSheet With .Shapes("Овал 1") 'вычисление координат границ Овала 1 'Здесь контекст- ActiveSheet.Shapes("Овал 1") , поэтому следующие 4 строчки отрабатывают корректно a = .Top b = .Top + .Height c = .Left d = .Left + .Width End With 'проход фиклом по объектам в коллекции shapes For Each фигура2 In .Shapes If фигура2.Name <> "Овал 1" Then 'вычисление координат границ фигуры2 и пересечения с овалом 'а вот здесь контекст - activesheet и следующие 4 не будут работать (в классе worksheet нету свосйтв top и left) 'чтобы работало нужно или обернуть их в конструкцию with фигура2 ... end with, или писать e=фигура2.top e = .Top f = .Top + .Height g = .Left h = .Left + .Width i = Application.Median(a, b, e, f) j = Application.Median(c, d, g, h) If i < a And i > b And j > c And j < d Then Надвинуто = True End If Next End With End Sub
Добрался таки до компа, вспомнил, что .Top отсчитывается сверху, поменял местами 2 знака > и < [vba]
Код
Option Explicit Sub DetectIntersection() Dim a&, b&, c&, d&, e&, f&, g&, h&, i&, j&, k%, arr$(), Фигура2 As Object, sCallerName$ Const ShName$ = "Oval 1" 'имя Фигуры1 With Application 'если макрос был запущен нажатием на шейп, пишем в переменную имя этого шейпа If TypeName(.Caller) = "Shape" Then sCallerName = .Caller.Name With ActiveSheet 'контекст - активный лист, (все вызовы .Свойство или .Метод на этом уровне вложенности обращаются к нему) With .Shapes(ShName) 'контекст - Шейп с именем ShName 'вычисление координат границ Фигуры1 a = .Top: b = a + .Height c = .Left: d = c + .Width End With ' co следующей строки контекст снова активный лист 'проход циклом по объектам в коллекции shapes For Each Фигура2 In .Shapes 'Если имя Фигуры1 <> имени Фигуры1 и <> sCallerName (имя шейпа, если этот макрос был запущен кликом по нему) If Фигура2.Name <> ShName And Фигура2.Name <> sCallerName Then With Фигура2 'контекст - Фигура2 e = .Top: f = .Top + .Height g = .Left: h = .Left + .Width End With ' co следующей строки контекст снова активный лист 'вычисления медиан вертикальных и горизонтальных координат Фигуры1 и Фигуры2 i = Application.Median(a, b, f, e) j = Application.Median(c, d, g, h) 'если точка с координатами = полученных медиан находится внутри шейпа ShName If i > a And i < b And j > c And j < d Then 'Переопределяем размерность массива ReDim Preserve arr(k) 'пишем в последний элемент массива имя Фигуры2 arr(k) = Фигура2.Name k = k + 1 End If End If Next 'область непустых ячеек, граничащих с N4 With .[N4].CurrentRegion 'смещаемся на 1 ячейку вниз и выбираем столбец N With Intersect(.Cells, .Offset(1), .Parent.Columns("N")) 'Очищаем значения выбранных ячеек On Error Resume Next .ClearContents On Error GoTo 0 End With 'пишем новые значения из массива arr, если он не пуст If i Then .Offset(1).Resize(k).Value = Application.Transpose(arr) End With End With End With End Sub
[/vba]
Добрался таки до компа, вспомнил, что .Top отсчитывается сверху, поменял местами 2 знака > и < [vba]
Код
Option Explicit Sub DetectIntersection() Dim a&, b&, c&, d&, e&, f&, g&, h&, i&, j&, k%, arr$(), Фигура2 As Object, sCallerName$ Const ShName$ = "Oval 1" 'имя Фигуры1 With Application 'если макрос был запущен нажатием на шейп, пишем в переменную имя этого шейпа If TypeName(.Caller) = "Shape" Then sCallerName = .Caller.Name With ActiveSheet 'контекст - активный лист, (все вызовы .Свойство или .Метод на этом уровне вложенности обращаются к нему) With .Shapes(ShName) 'контекст - Шейп с именем ShName 'вычисление координат границ Фигуры1 a = .Top: b = a + .Height c = .Left: d = c + .Width End With ' co следующей строки контекст снова активный лист 'проход циклом по объектам в коллекции shapes For Each Фигура2 In .Shapes 'Если имя Фигуры1 <> имени Фигуры1 и <> sCallerName (имя шейпа, если этот макрос был запущен кликом по нему) If Фигура2.Name <> ShName And Фигура2.Name <> sCallerName Then With Фигура2 'контекст - Фигура2 e = .Top: f = .Top + .Height g = .Left: h = .Left + .Width End With ' co следующей строки контекст снова активный лист 'вычисления медиан вертикальных и горизонтальных координат Фигуры1 и Фигуры2 i = Application.Median(a, b, f, e) j = Application.Median(c, d, g, h) 'если точка с координатами = полученных медиан находится внутри шейпа ShName If i > a And i < b And j > c And j < d Then 'Переопределяем размерность массива ReDim Preserve arr(k) 'пишем в последний элемент массива имя Фигуры2 arr(k) = Фигура2.Name k = k + 1 End If End If Next 'область непустых ячеек, граничащих с N4 With .[N4].CurrentRegion 'смещаемся на 1 ячейку вниз и выбираем столбец N With Intersect(.Cells, .Offset(1), .Parent.Columns("N")) 'Очищаем значения выбранных ячеек On Error Resume Next .ClearContents On Error GoTo 0 End With 'пишем новые значения из массива arr, если он не пуст If i Then .Offset(1).Resize(k).Value = Application.Transpose(arr) End With End With End With End Sub
Sub Date_And_Time_GAZ_2() Dim start_time As Date, i As Integer, Arr(), bool As Boolean, calc&
start_time = InputBox("Введите дату, с которой начнётся таблица. Например 01.01.2019") Arr = [transpose(transpose(mod(row(r1:r24),24)))/24] With Application bool = .AutoCorrect.AutoFillFormulasInLists .AutoCorrect.AutoFillFormulasInLists = False: calc = .Calculation .ScreenUpdating = 0: .EnableEvents = 0: .Calculation = xlCalculationManual With .ActiveSheet.ListObjects.Add(xlSrcRange, Range(Cells(1, 1), Cells(10010, 10)), , xlNo) .Name = "ГАЗ" For i = 2 To (.ListRows.Count \ 24) * 24 Step 24 With .ListColumns(1).Range.Cells(i) .Value = start_time + i \ 24 With .Offset(, 1).Resize(24) .Value = Arr .NumberFormat = "hh:mm" End With .Offset(23, 2).Resize(, 5).Borders(xlEdgeBottom).Weight = xlThick With .Offset(23, 7).Resize(, 3) .Interior.ColorIndex = 27 .Borders.Weight = xlThick .Cells(1, 3).FormulaR1C1 = "= RC[-2]+RC[-1]" End With End With Next End With Application.AutoCorrect.AutoFillFormulasInLists = bool .ScreenUpdating = 1: .EnableEvents = 1: .Calculation = calc End With End Sub
[/vba]
в начале кода [vba]
Код
dim bool as Boolean bool = Application.AutoCorrect.AutoFillFormulasInLists Application.AutoCorrect.AutoFillFormulasInLists = False
Sub Date_And_Time_GAZ_2() Dim start_time As Date, i As Integer, Arr(), bool As Boolean, calc&
start_time = InputBox("Введите дату, с которой начнётся таблица. Например 01.01.2019") Arr = [transpose(transpose(mod(row(r1:r24),24)))/24] With Application bool = .AutoCorrect.AutoFillFormulasInLists .AutoCorrect.AutoFillFormulasInLists = False: calc = .Calculation .ScreenUpdating = 0: .EnableEvents = 0: .Calculation = xlCalculationManual With .ActiveSheet.ListObjects.Add(xlSrcRange, Range(Cells(1, 1), Cells(10010, 10)), , xlNo) .Name = "ГАЗ" For i = 2 To (.ListRows.Count \ 24) * 24 Step 24 With .ListColumns(1).Range.Cells(i) .Value = start_time + i \ 24 With .Offset(, 1).Resize(24) .Value = Arr .NumberFormat = "hh:mm" End With .Offset(23, 2).Resize(, 5).Borders(xlEdgeBottom).Weight = xlThick With .Offset(23, 7).Resize(, 3) .Interior.ColorIndex = 27 .Borders.Weight = xlThick .Cells(1, 3).FormulaR1C1 = "= RC[-2]+RC[-1]" End With End With Next End With Application.AutoCorrect.AutoFillFormulasInLists = bool .ScreenUpdating = 1: .EnableEvents = 1: .Calculation = calc End With End Sub
Set c_x1y1 = Range(Cells(2, 2), Cells(3, lastcol)) Set c_x2y2 = Range(Cells(6, 2), Cells(7, lastcol))
With ActiveSheet.Shapes On Error Resume Next i = 1 Do While Err = 0 .Item("line " & i).Delete .Item("label " & i).Delete i = i + 1 Loop On Error GoTo 0 For i = 1 To lastcol - 1 x = c_x1y1(1, i) + (c_x2y2(1, i) - c_x1y1(1, i) - c_x1y1(1, 1).Width) / 2 y = c_x1y1(2, i) + (c_x2y2(2, i) - c_x1y1(2, i) - c_x1y1(7, 1).Height) / 2 With .AddConnector(1, c_x1y1(1, i), c_x1y1(2, i), c_x2y2(1, i), c_x2y2(2, i)) .Name = "line " & i End With With .AddTextbox(1, x, y, c_x1y1(1, i).Width, c_x1y1(7, i).Height) .Name = "label " & i h = .Height With .TextFrame .Characters.Text = c_x1y1(7, i) .HorizontalAlignment = xlHAlignCenter .VerticalAlignment = xlVAlignCenter .MarginBottom = 0: .MarginLeft = 0 .MarginRight = 0: .MarginTop = 0 .AutoSize = True End With If .Height <> h Then .Top = .Top - (.Height - h) / 2 End With Next i End With End Sub
[/vba]
Glass4217, намучаетесь вы еще с такими именами переменных... [vba]
Код
Sub Вариант_1() Dim c_x1y1 As Range, c_x2y2 As Range, x#, y#, i%, h#
Set c_x1y1 = Range(Cells(2, 2), Cells(3, lastcol)) Set c_x2y2 = Range(Cells(6, 2), Cells(7, lastcol))
With ActiveSheet.Shapes On Error Resume Next i = 1 Do While Err = 0 .Item("line " & i).Delete .Item("label " & i).Delete i = i + 1 Loop On Error GoTo 0 For i = 1 To lastcol - 1 x = c_x1y1(1, i) + (c_x2y2(1, i) - c_x1y1(1, i) - c_x1y1(1, 1).Width) / 2 y = c_x1y1(2, i) + (c_x2y2(2, i) - c_x1y1(2, i) - c_x1y1(7, 1).Height) / 2 With .AddConnector(1, c_x1y1(1, i), c_x1y1(2, i), c_x2y2(1, i), c_x2y2(2, i)) .Name = "line " & i End With With .AddTextbox(1, x, y, c_x1y1(1, i).Width, c_x1y1(7, i).Height) .Name = "label " & i h = .Height With .TextFrame .Characters.Text = c_x1y1(7, i) .HorizontalAlignment = xlHAlignCenter .VerticalAlignment = xlVAlignCenter .MarginBottom = 0: .MarginLeft = 0 .MarginRight = 0: .MarginTop = 0 .AutoSize = True End With If .Height <> h Then .Top = .Top - (.Height - h) / 2 End With Next i End With End Sub
Да я и так все, что нужно разглядел Сформировать код таблицы из буфера обмена не составляет сложности (собственно, это ужо сделано), но вот сайт его не принимает, видимо те посты писались через wysiwyg-редактор или нужны привилегии.
Да я и так все, что нужно разглядел Сформировать код таблицы из буфера обмена не составляет сложности (собственно, это ужо сделано), но вот сайт его не принимает, видимо те посты писались через wysiwyg-редактор или нужны привилегии.krosav4ig
в продолжение к #217 и тут Дописал я скрипт для вставки bb-кодов таблиц, добавил код для преобразования bb-кодов в таблицы. Вот пара таблиц для теста, без установленного скрипта будут отображаться только коды
Таблица, вставленная из Word, форматирование частично сохраняется[table][tr][td]Столбец1[/td][td]Столбец2[/td][td]Столбец3[/td][td]Столбец4[/td][td]Столбец5[/td][/tr][tr][td rowspan="5"]1 [/td][td]14[/td][td]17[/td][td]7[/td][td]14[/td][/tr][tr][td colspan="4"]2[/td][/tr][tr][td colspan="3" rowspan="3"]3[/td][td]8[/td][/tr][tr][td]15[/td][/tr][tr][td]18[/td][/tr][/table]Таблица, вставленная из Excel, пока сохраняется только структура, без форматирования [table][tr][td]Столбец1[/td][td]Столбец2[/td][td]Столбец3[/td][td]Столбец4[/td][td]Столбец5[/td][td]Столбец6[/td][td]Столбец7[/td][td]Столбец8[/td][/tr][tr][td colspan="2" rowspan="5"]463[/td][td]3[/td][td]80[/td][td]210[/td][td rowspan="2"]447[/td][td]282[/td][td]31[/td][/tr][tr][td]207[/td][td]347[/td][td]471[/td][td]359[/td][td]246[/td][/tr][tr][td colspan="6" rowspan="2"]10[/td][/tr][tr][/tr][tr][td]166[/td][td rowspan="7"]80[/td][td]55[/td][td colspan="2" rowspan="7"]218[/td][td]175[/td][/tr][tr][td]123[/td][td]425[/td][td]445[/td][td]308[/td][td]465[/td][/tr][tr][td]365[/td][td]159[/td][td]147[/td][td]162[/td][td]285[/td][/tr][tr][td]76[/td][td]492[/td][td]160[/td][td]63[/td][td]120[/td][/tr][tr][td colspan="2" rowspan="2"]100[/td][td]117[/td][td]130[/td][td]239[/td][/tr][tr][td]57[/td][td]275[/td][td]173[/td][/tr][tr][td]279[/td][td]8[/td][td]469[/td][td]292[/td][td]89[/td][/tr][/table]
вот так эти таблицы выглядят у меня с установленным скриптом в tampermonkey
в продолжение к #217 и тут Дописал я скрипт для вставки bb-кодов таблиц, добавил код для преобразования bb-кодов в таблицы. Вот пара таблиц для теста, без установленного скрипта будут отображаться только коды
Таблица, вставленная из Word, форматирование частично сохраняется[table][tr][td]Столбец1[/td][td]Столбец2[/td][td]Столбец3[/td][td]Столбец4[/td][td]Столбец5[/td][/tr][tr][td rowspan="5"]1 [/td][td]14[/td][td]17[/td][td]7[/td][td]14[/td][/tr][tr][td colspan="4"]2[/td][/tr][tr][td colspan="3" rowspan="3"]3[/td][td]8[/td][/tr][tr][td]15[/td][/tr][tr][td]18[/td][/tr][/table]Таблица, вставленная из Excel, пока сохраняется только структура, без форматирования [table][tr][td]Столбец1[/td][td]Столбец2[/td][td]Столбец3[/td][td]Столбец4[/td][td]Столбец5[/td][td]Столбец6[/td][td]Столбец7[/td][td]Столбец8[/td][/tr][tr][td colspan="2" rowspan="5"]463[/td][td]3[/td][td]80[/td][td]210[/td][td rowspan="2"]447[/td][td]282[/td][td]31[/td][/tr][tr][td]207[/td][td]347[/td][td]471[/td][td]359[/td][td]246[/td][/tr][tr][td colspan="6" rowspan="2"]10[/td][/tr][tr][/tr][tr][td]166[/td][td rowspan="7"]80[/td][td]55[/td][td colspan="2" rowspan="7"]218[/td][td]175[/td][/tr][tr][td]123[/td][td]425[/td][td]445[/td][td]308[/td][td]465[/td][/tr][tr][td]365[/td][td]159[/td][td]147[/td][td]162[/td][td]285[/td][/tr][tr][td]76[/td][td]492[/td][td]160[/td][td]63[/td][td]120[/td][/tr][tr][td colspan="2" rowspan="2"]100[/td][td]117[/td][td]130[/td][td]239[/td][/tr][tr][td]57[/td][td]275[/td][td]173[/td][/tr][tr][td]279[/td][td]8[/td][td]469[/td][td]292[/td][td]89[/td][/tr][/table]
вот так эти таблицы выглядят у меня с установленным скриптом в tampermonkey krosav4ig