Вы не используете подарки, которые дает вам Workbook_SheetActivate. Sh - объект рабочего листа, который активируется.
Ваше объявление переменной является henky; вы объявляете Dim MySheets As String, но никогда не используете его и не назначаете MySheet = «Sheet1» и MySheet2 = «Sheet2», не объявляя их.
Некоторые уровни идентификации листа лучше обрабатываются с помощью свойства кодового файла , который изменяется гораздо реже.
Option Explicit
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim response As String
If IsError(Application.Match(Sh.CodeName, Array("Sheet1", "Sheet2"), 0)) Then
Sh.Visible = xlSheetHidden
response = InputBox("Enter password to view sheet")
If response = "MyPass" Then
Application.EnableEvents = False
Sh.Visible = xlSheetVisible
Sh.Activate
Application.EnableEvents = True
End If
End If
Sheet1.Visible = True
Sheet2.Visible = True
End Sub
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
If IsError(Application.Match(Sh.CodeName, Array("Sheet1", "Sheet2"), 0)) Then
Sh.Visible = xlSheetHidden
End If
End Sub
Предполагая, что вы хотите сохранить порядок в массиве - имена перечислены в том же порядке, что и идентификаторы в оригинале relation_ids
.
Я предлагаю конструктор ARRAY поверх коррелированного подзапроса с unnest()
и WITH ORDINALITY
, присоединенного к таблице names
, например:
SELECT r.*
, (ARRAY (
SELECT n.first_name
FROM unnest(r.relation_ids) WITH ORDINALITY AS a(user_id, ord)
JOIN names n ON n.user_id = a.user_id
ORDER BY a.ord
)
) AS first_names
FROM relations r;
Этот запрос сохраняет [ 1116] все строк из relations
в любом случае.
Угловые случаи, на которые следует обратить внимание:
1. Значение NULL
в relation_ids
(для всего столбца) переводится в пустой массив. (Аналогично пустому массиву в источнике.)
2. NULL
элементы молча удаляются из массива.
Возможно, вы захотите определить желаемое поведение, если эти угловые случаи возможны ...
db <> fiddle здесь
Связанные:
Рассматривается нормализованный дизайн БД:
Это вернет вам все столбцы и строки из отношений с именем, добавленным в таблицу имен.
Select Relations.relation_ids, Names.user_id, Names.first_name From Relations
Inner Join Names On Relations.user_id=Names.user_id