For and Next ...

23 отговора 0 прегледа
#1

For and Next ...

Здравейте!

Моля ви ако някой знае да ме светне що се получава така:
Имам два листа : "Справка" и "База",до тук добре
В лист "База" от "А1" до "А30" съм поставил трите имена на хора...
В лист "Справка в колона "А" от 1 ред до 30 ред имам същия списък от хора но в разбъркан ред , тоест ако Димитър Петров Петров в лист "База" е на първия ред , то в лист "Справка" е да кажем на третия ред...
В лист "Справка" съм поставил бутон който прехвърля данните срещу всеки човек в лист "База" срещу съответния човек!
Ето го кода:
For J = 12 To 55
If (Sheets("Справка").Cells(J, 2)) = (Sheets("База").Cells(J, 2)) Then
Sheets("База").Cells(J, 5) = Sheets("Справка").Range("AQ" & J)
Sheets("База").Cells(J, 6) = Sheets("Справка").Range("AL" & J)
Sheets("База").Cells(J, 7) = Sheets("Справка").Range("AK" & J)
Sheets("База").Cells(J, 41) = Sheets("Справка").Range("AP" & J)
End If
Next J
Нещата се получават ако в лист "Справка" и в лист "База" имената се съвпадат по редове , пример: лист "Справка" в клетка "А1" - Димитър Петров Петров и в лист "База" в клетка "А1"- Димитър Петров Петров.

Идеята ми е такава: реда на имената написани в лист "Справка" да не съвпада с реда на имената в лист "База"
Тоест взимам си едно име примерно: Петър Петров Петров е в клетка "А3" в лист : "Справка", а в лист "База" Петър Петров Петров е в клетка "А10". Когато натисна бутона "Прехвърли" то данните срещу Петър в лист "Справка" да се отпечатат точно срещу Петър в клетка "А10" в лист "База".
Много съм обстоятелствен, но вече дълго време не мога да си обясня защо с този сорс не се поучава.
Благодаря ви !

Отговор
в отговор на vector_m #2

Re: For and Next ...

Аз бих сложил преди
END IF
едно ELSE
после да мушна един код между ELSE и ENDIF , с който да потърся тва дет ми требе и като го намерия да си прехвърля (ако го намеря де).

Напиши кво не е ясно и ако има проблем да ръсим още мозък....

Малко тва A1 do A30 не схванах що цикъла е от 12 до 55, ама нейсе...Може съм попрекалил с мастиката...

Отговор
в отговор на Ивaн #3

Re: For and Next ...

Ами идеята ми е такава :
В лист "База" списъка от хора няма да се променя , т.е мястото на хората в списъка няма да се променя , та така да стане че да се търси съвпадение на имена и когато има такова то там да постави данни .

Защото с този сорс, който съм постнал ако примерно Иван в лист "Справка" е в клетка "А1" и в клетка "В1" има числото 5 , а в лист "База" Иван е в клетка "А10" то срещу Иван , в клетка "В10" в лист "База" , се отпечатва нула а не числото 5 , тоест приема, че ЧОВЕКА в лист "Справка" в клетка "А1" не равно на аналогичната клетка в лист "База"
Не зная как да го обясня...

Отговор
в отговор на Ивaн #4

Re: For and Next ...

Казано с други думи:
По-горе написах, че ти проверяваш (и правиш нещоситам), когато ЕДНОТО е РАВНО на ДРУГОТО. Драсни код и в случаите, когато ЕДНОТО НЕ Е РАВНО на ДРУГОТО. Демек В ПРОТИВЕН СЛУЧАЙ - тва дет американците му викат ELSE.
Там трябва да има код, дето да търси на кой ред е РАВНОТО НЕЩО и ако го намери да го прехвърли в другия лист.
Напиши кода и ако не работи го copy/paste тука.

Отговор
в отговор на vector_m #5

Re: For and Next ...

Първо виж какво прави командата
VLOOKUP, дали няма да се разминеш без макрос.

Второ, ако държиш на макроса, трябва да вложиш
два цикъла - външният да обхожда единия списък поред,
а вътрешният - да претърсва другия списък за съвпадение.

Дали ме разбра?

Съкращавайте фразите до размера на мисъл. М.Вайсберг
Отговор
в отговор на пpивeт #6

Re: For and Next ...

Здравей!
По- добре с макрос!
Разбирам идеята ти , но не ми е ясно как да я реализирам! Би ли ми подсказал как става това? Благодаря за съдействието! :)

Отговор
в отговор на vector_m #7

Re: For and Next ...

For J = 12 To 55
If (Sheets("Справка").Cells(J, 2)) = (Sheets("База").Cells(J, 2)) Then
Sheets("База").Cells(J, 5) = Sheets("Справка").Range("AQ" & J)
Sheets("База").Cells(J, 6) = Sheets("Справка").Range("AL" & J)
Sheets("База").Cells(J, 7) = Sheets("Справка").Range("AK" & J)
Sheets("База").Cells(J, 41) = Sheets("Справка").Range("AP" & J)
End If
Next J

това аз бих го преработил така:

sub AlaBala( J as long)
DIM J as long, Namereno as boolean, K as long, St as String

namereno=false
K=11
while (K<55) and (not namereno) do
K=K+1
namereno=(Sheets("Справка").Cells(J, 2)) = (Sheets("База").Cells(K, 2))
wend

if namereno then
Sheets("База").Cells(K, 5) = Sheets("Справка").Range("AQ" & J)
Sheets("База").Cells(K, 6) = Sheets("Справка").Range("AL" & J)
Sheets("База").Cells(K, 7) = Sheets("Справка").Range("AK" & J)
Sheets("База").Cells(K, 41) = Sheets("Справка").Range("AP" & J)
else
st="Не спи като въвеждаш!"
Sheets("База").Cells(K, 5) = st
Sheets("База").Cells(K, 6) = st
Sheets("База").Cells(K, 7) = st
Sheets("База").Cells(K, 41) = st
end if

end Sub
Е, не претендирам за грешки в кода, ама нещо таквоз...
Ако цикълът е с FOR имаш винаги обхождане до края (освен ако не излезеш принудително, ама не е за предпочитане таквоз програмиране).Даже и да го намери тенекето на 1 още....При голяма номенклатура - ще се бави.
Разбира се могат да се ползват и готовите функции на М$. Аз не го правя по 2 причини (винаги когато мога де):
1.По-лесно е ако един ден се наложи за преработка за в опънатия офис
2.Мразим М$ (работим на продуктите му по принуда). По секакъв начин те карат те да си все по-зависим от тях...

Ади пиши кво стана с кода.

Отговор
в отговор на Ивaн #8

Re: For and Next ...

Дефинирал съм по погрешка още веднъш J.

DIM J as long, Namereno as boolean, K as long, St as String

го направи:

DIM Namereno as boolean, K as long, St as String

То интерпретатора на ЕКСЕЛА сигурно щеше да ревне, ама знам ли... Дано нема още грешки че кода го писах направо тука.

Отговор
в отговор на Ивaн #9

Re: For and Next ...

Както казваш ти Ексела ревна!
Аз ти благодаря, че съдействаш!
Значи, първо реда с do светна - не ми е ясно за какво е и за това го махнах; Второ, реда Namereno = (Sheets("&#209;&#239;&#240;&#224;&#226;&#234;&#224;").Cells(J, 2)) = (Sheets("&#193;&#224;&#231;&#224;").Cells(K, 2)) и той светна;
ето сорса:


Private Sub CommandButton2_Click()
Dim Namereno As Boolean, K As Long, St As String
If MsgBox("Моля, изчакайте, докато данните се прехвърлят !", vbOKCancel + vbInformation, "Прехвърляне...") = vbOK Then
For J = 12 To 55
Namereno = False
K = 11
While (K < 55) And (Not Namereno)

K = K + 1
Namereno = (Sheets("Справка").Cells(J, 2)) = (Sheets("База").Cells(K, 2))
Wend
If Namereno Then
Sheets("База").Cells(K, 5) = Sheets("Справка").Range("AQ" & J)
Sheets("База").Cells(K, 6) = Sheets("Справка").Range("AL" & J)
Sheets("База").Cells(K, 7) = Sheets("Справка").Range("AK" & J)
Sheets("База").Cells(K, 41) = Sheets("Справка").Range("AP" & J)
Else
St = "Не спи като въвеждаш!"
Sheets("База").Cells(K, 5) = St
Sheets("База").Cells(K, 6) = St
Sheets("База").Cells(K, 7) = St
Sheets("База").Cells(K, 41) = St
End If
Next J
End If
end sub

Благодаря!

Отговор
в отговор на vector_m #10

Re: For and Next ...

Сорка за error-a проблемът е в предмониторното устройство. Все ги бъркам двата щата БАЗИКА и ПАСКАЛА (делфи де). Махнал си го DO - добре!
Ако бях на твое място бих преработи кода така:

Private Sub CommandButton2_Click()
Dim Namereno As Boolean, K As Long, St As String
Dim Name1 as string,Name2 as string, J as long
'J си го дефинирам по навик от паскала,че там е задължително
'при различните видове БАЗИЦИ и може и да не се дефинира
'но имаше некъв БАЗИК дето бачкаше до 10 недефиниран масив (напр)....
Name1="База"
Name2="Справка"
'тука избягвам варианта - кирилица/латинаица и грешно изписване на името на листа
If MsgBox("Моля, изчакайте, докато данните се прехвърлят !", vbOKCancel + vbInformation, "Прехвърляне...") = vbOK Then
For J = 12 To 55
Namereno = False
K = 11
While (K < 55) And (Not Namereno)

K = K + 1
Namereno = (Sheets(Name2).Cells(J, 2).value = Sheets(Name1).Cells(K, 2) .Value)
Wend
If Namereno Then
Sheets(Name1).Cells(K, 5) = Sheets(Name2).Range("AQ" & J)
Sheets(Name1).Cells(K, 6) = Sheets(Name2).Range("AL" & J)
Sheets(name1).Cells(K, 7) = Sheets(Name2).Range("AK" & J)
Sheets(Name1).Cells(K, 41) = Sheets(Name2).Range("AP" & J)
Else
St = "Не спи като въвеждаш!"
Sheets(Name1).Cells(K, 5).value = St
Sheets(name1).Cells(K, 6).value = St
Sheets(Name1).Cells(K, 7).value = St
Sheets(Name1).Cells(K, 41).value = St
End If
Next J
End If
end sub



И да знаш: тва VALUE все го изтървам...Ае че чъм на греянка, че с тва гадното време - пролет-зимя-лято нещо съм прихванал. А както казват мислителите:
ВСИЧКИ БОЛЕСТИ ИДАТ ОТ НЕРЕДОВНОТО ПИЕНЕ!

Наздраве и пиши кво е станало.

Отговор
в отговор на Ивaн #11

Re: For and Next ...

Наздраве и на теб! :)))
Ами да ти кажа този ред пак светва. Тоя сорс вече го сънувам и пак не мога да разбера защо светва!

ето го въпросния ред:

Namereno = (Sheets(Name2).Cells(J, 2)) = Sheets(Name1).Cells(K, 2)

Отговор
в отговор на vector_m #12

Re: For and Next ...

Namereno = (Sheets(Name2).Cells(J, 2)) = Sheets(Name1).Cells(K, 2)

да стане на

Namereno = (Sheets(Name2).Cells(J, 2).VALUE = Sheets(Name1).Cells(K, 2).VALUE)

Отговор
в отговор на Ивaн #13

Re: For and Next ...

Здрастииииии !

Нали знаеш, че тоя ред пак пищи... Не мога и не мога да разразбера, каде е тая грешка.
Логично ми се вижда издържано...

Отговор
в отговор на vector_m #14

Re: For and Next ...

Ако е трудно да copy/paste кода:
Namereno = (Sheets(Name2).Cells(J, 2).VALUE = Sheets(Name1).Cells(K, 2).VALUE)
то можеш да го разбиеш така:
if Sheets(Name2).Cells(J, 2).VALUE = Sheets(Name1).Cells(K, 2).VALUE then
Namereno=true
else
namereno=false
end if

за по-горния пост виж тва дето е написано с големи букви (добавено към твоя код) ".VALUE". То все едно казва на ексела:
Sheets(Name2).Cells(J, 2).VALUE
Лист Name2, Клетка ред J, колона 2, ей тва дет е вътре.
Можеш да сложеш един BreakPoint на сорса и да трасираш, дали нещо се е осрало.Много пъти съм си хващал грешки по тоя начин...След часове зверене на теливизора му се струва на човек, че всичко е наден, а се оказва че ....... (нещо съвсем елементарно - като буква на кирилица, интервал нейде, офиса нещио не харесва - дет стария го е харесвал и т.н.)

Отговор
в отговор на vector_m #15

Re: For and Next ...

Ей! Нищо не казваш маааму стара! Кажи 2 думи барем! Ядем си салатката и жената реве че е без повод... (дъртата и тя съска на тъста същото)
Дай повод бере човек!

Отговор
в отговор на Ивaн #16

Re: For and Next ...

Нищо не стана! До сега бях зает с други проекти... Сега ще си заделя повечко време за да докарам и този до край! Не мислех, че този сорс ще ми се опъне...
Най-вероятно ще трябва да пробвам по съвсем друга логика, за да разреша проблема! :)

Отговор
в отговор на vector_m #17

Re: For and Next ...

Дай малко по-вечко инфо:
1.Кажи какво съобщение излиза поне.
2.Дай някакъв код, дето е последен.
3.Може да качиш нейде файлче и некви данни и да дадеш линк.

Отговор
в отговор на Ивaн #18

Re: For and Next ...

OK Иване!
Дай мейл да ти го изпратя проектчето за да му хвърлиш око! :)

Отговор
в отговор на vector_m #19

Re: For and Next ...

Bai.Ivan.1955@abv.bg

Отговор
в отговор на vector_m #20

Re: For and Next ...

изцяло грешен подход.
с тоя код проверяваш дали на един и същи ред в двата листа имаш съвпадение на имена....
трябва да имаш два два цикъла един в друг
кода трябва да ти е такъв:
For J = 12 To 55
For i = 12 To 55
If (Sheets("Справка").Cells(J, 2)) = (Sheets("База").Cells(i, 2)) Then
Sheets("База").Cells(i, 5) = Sheets("Справка").Range("AQ" & J)
Sheets("База").Cells(i, 6) = Sheets("Справка").Range("AL" & J)
Sheets("База").Cells(i, 7) = Sheets("Справка").Range("AK" & J)
Sheets("База").Cells(i, 41) = Sheets("Справка").Range("AP" & J)
Exit for
End If
Next i
Next J

Отговор