Перебор списка изображений, использование резервной копии, если она не найдена?

#excel #vba

#excel #vba

Вопрос:

У меня есть два столбца в файле CSV — столбцы A и C, в первом из которых содержатся номера элементов, а во втором — изображения, которые могут иметь или не иметь одинаковый номер элемента. Я хочу, чтобы соответствующее изображение отображалось рядом в столбце B.

Изображения бывают нескольких разных форм в зависимости от размера, первым выбором является изображение, заканчивающееся на «-ROOM.jpg » за которым следует изображение, заканчивающееся на «-5.jpg», а затем «-6.jpg», Если я не могу найти первый тип, я бы хотел вернуться к «-5.jpg», а затем «-6.jpg».использование условного оператора.

Вот как выглядят первые несколько строк:

введите описание изображения здесь

 | SKU         |   | image                |
|-------------|---|----------------------|
| SHS211A-9   |   | SG140B-3.jpg         |
| SHS211A-8   |   | SG140E-4R-FLOOR2.jpg |
| SHS211A-6SQ |   | SG140E-5.jpg         |
| SHS211A-6   |   | SG140E-6R-FLOOR.jpg  |
| SHS211A-5   |   | SG140E-6R-ROOM.jpg   |
| SHS211A-3   |   | SG140E-8-ROOM.jpg    |
| SHS211A-28  |   | SG140E-8.jpg         |
| SHS211A-26  |   | SG140E-4R-FLOOR1.jpg |
| SHS211A-24  |   | SG140E-4R-FLOOR2.jpg |
| SHS211A-2   |   | SG140G-4R.jpg        |
| SHS211A     |   | SG140G-5-FLOOR.jpg   |
  

Я пробовал это, но он не проверяет типы изображений (очень незнаком с VBA):

 Sub Adrift()
    Dim NA As Long, NC As Long, v As String, I As Long, J As Long
    Dim v2 As String
    NA = Cells(Rows.Count, "A").End(xlUp).Row
    NC = Cells(Rows.Count, "C").End(xlUp).Row
    For I = 2 To NA
        v = Cells(I, "A").Value
        v2 = ""
        For J = 2 To NC
            If InStr(Cells(J, "C").Value, v) > 0 Then
                v2 = v2 amp; ";" amp; Cells(J, "C").Value
            End If
        Next J
        Cells(I, "A").Offset(0, 1).Value = Mid(v2,2)
    Next I
End Sub
  

Комментарии:

1. Чтобы уточнить, я хочу сопоставить артикул, а затем посмотреть, есть ли КОМНАТА, соответствующая этому артикулу, и если нет, используйте 5, 6 и 4 в качестве резервных вариантов. Я надеюсь, что это имеет смысл, и если это слишком много, чтобы спрашивать без проблем, мне придется освежить в памяти ссылку на язык VBA. Спасибо!

2. Итак, каков будет ожидаемый ответ на вышеизложенное?

3. Да, для меня это выглядит правильно. Спасибо за редактирование! Правильным ответом будет SHS211A-8, чтобы иметь SHS211A-8-ROOM.jpg примыкающий к нему. Это изображение находится дальше в файле CSV, но после итерации по столбцу C оно найдет и сопоставит его на основе значений столбца A. Если изображение КОМНАТЫ не существует, мы хотели бы получить изображение, соответствующее размеру («-8.jpg»), и если его не существует, мы прибегаем к поиску чего-либо, что соответствует части элемента («SHS211A»). Надеюсь, это не сбивает с толку, это довольно громоздко, и его нужно будет расширить. Мне просто нужно какое-то направление.

4. Я бы прочитал в массив, а затем зациклил это. Однако я бы использовал Select Case True, а затем каждое из предпочтительных совпадений (case InStrRev …> 0 ) по порядку, как случаи внутри вашего двойного цикла. Затем вы можете заполнить средний «столбец» массива, когда случай сопоставлен, и записать все это обратно на лист за один раз.

5. Я собираюсь провести некоторое исследование ( learn.microsoft.com/en-us/office/vba/api/overview/excel ) Я ценю советы.

Ответ №1:

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

Предполагается одинаковая длина для A и C. Если C длиннее, используйте «C» в arr = ws.Range("A2:C" amp; ws.Cells(ws.Rows.Count, "C").End(xlUp).Row) . Если A длиннее, код в порядке, как есть.

 Option Explicit

Public Sub test()

    Dim ws As Worksheet, arr(), r As Long, c As Long

    Set ws = ThisWorkbook.Worksheets("Sheet1")

    arr = ws.Range("A2:C" amp; ws.Cells(ws.Rows.Count, "A").End(xlUp).Row)
    
    On Error Resume Next
    
    For r = LBound(arr, 1) To UBound(arr, 1)

        For c = LBound(arr, 1) To UBound(arr, 1)
 
            Select Case True

            Case Right$(arr(c, 3), 9) = "-ROOM.jpg" And Left$(arr(c, 3), Len(arr(c, 3)) - 9) = arr(r, 1)
                arr(r, 2) = arr(c, 3)
                Exit For
            Case Right$(arr(c, 3), 6) = "-5.jpg" And Left$(arr(c, 3), Len(arr(c, 3)) - 6) = arr(r, 1)
                arr(r, 2) = arr(c, 3)
                Exit For
            Case Right$(arr(c, 3), 6) = "-6.jpg" And Left$(arr(c, 3), Len(arr(c, 3)) - 6) = arr(r, 1)
                arr(r, 2) = arr(c, 3)
                Exit For

            End Select
   
        Next

    Next
    
    On Error GoTo 0
    
    ws.Range("A2").Resize(UBound(arr, 1), UBound(arr, 2)) = arr
End Sub
  

Комментарии:

1. Это отличное начало, спасибо! Я думаю, что попробую сделать это на PHP сам, поскольку мне не хочется знакомиться с VBA, поскольку я не очень хорошо его знаю. Я скоро соглашусь, потому что вы были очень полезны.

2. Когда у вас появится такая возможность, пожалуйста, свяжитесь со мной по адресу ahdrift@protonmail.com — для решения потребуется еще 3 или 4 случая в Select Case True заявлении, но я готов заплатить до 50 долларов за полное решение и хотел бы учиться сам, поскольку я не использую много VBA. Дайте мне знать, если вам интересно, спасибо.

3. Обмен денег не требуется. Рад помочь. У вас достаточно репутации, чтобы открыть комнату для работы над решением здесь. Разговор будет сохраняться в течение «всего» времени 🙂