#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. Обмен денег не требуется. Рад помочь. У вас достаточно репутации, чтобы открыть комнату для работы над решением здесь. Разговор будет сохраняться в течение «всего» времени 🙂