• DİKKAT

    DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
    Altın Üyelik Hakkında Bilgi

Seçenekler Arasından Seçim

Ömer BARAN

Uzman
Katılım
8 Mart 2011
Mesajlar
12,986
Excel Vers. ve Dili
Office 2013 ( 32 bit ) TÜRKÇE
Mevcut excel belgesindeki makro kodu 2 no'lu mesajda.
Mevcut bu kod; O - BQ sütunları arasındaki 55 seçenekten, maalesef sadece birinci seçeneği getiriyor.


Excel belgemin HESAP sayfasındaki E stununda KALIP isimleri var, bunlar arasında tekrarlananlar da mevcut.
Diğer sayfamda ( 04.kal. mak eşleşmesi) ise bu kalıpların hangi makinelere takılabildiğini gösterir bir liste var.

04... sayfasındaki bilgilerin anlamı şudur:

Satırlar: her bir kalıbın takılabildiği makinelerin isimleridir.
Sütunlar: her bir makineye takılabilecek kalıplar hangileridir.

Belgenin HESAP sayfasında; E sütunundaki kalıp adından hareketle 04.kal.mak eşl... sayfasından, O-BQ sütunlarına bilgi çekiliyor.

HESAP sayfası E sütunundaki değerlerin karşısına O-BQ sütunlarındaki seçeneklerden birinin M sütununa yazılmasını sağlamam gerekiyor.

AMAÇ:
Bu yapılırken de hedefim tam olarak şöyleydi; M sütununda bir satıra yazılacak makine isminin, yazıldığı satırdan önce en az tekrarlanması.

Örneğin E7 hücresindeki K_355 isimli kalıp için tek makine seçeneği var ( M_05), bu makine aynı zamanda E18 hücresindeki K_294 isimli kalıbın da makine seçeneklerinden biri durumunda. Böyle olunca M_05 isimli makineyi tek seçeneği olduğu için K_355 isimli kalıba tahsis etmek, K_294 isimli kalıp için M_05 isimli makine seçeneği yerine diğer seçeneklerden biri olan örneğin M_11 'i tahsis etmek gerekiyor.

Sonuçta ihtiyaç olan kalıbı boş ilk makineye tahsis ederek bekleme süresini azaltmaya çalışıyorum. Çünkü makine sayısı 55 ile sınırlı.

Buraya kadar yazdıklarımı sağlamak üzere Sayın Mustafa Mutlu Bey tarafından yazılmış olan makro mevcut.

MEVCUT MAKROYA İLİŞKİN SORUNU ŞU ÖRNEKLE AÇIKLAMAYA ÇALIŞAYIM

Makronun makine adlarını yazdığı M sütununda; örneğin M_03 'ü süzdüğümde;
M_03 isimli makine,
K_012, K_014, K_79, K_148, K_254, K_268, K_275 ve K_300
isimli kalıpların karşısına yazılmıştır.

- K_254 için zaten başka seçenek yok zorunlu olarak M_03 ile eşleşecek,

Ancak;
- K_14 için M_55 seçeneği de var ve bu makine ismi daha önce kullanılmamış,
- K_148 için daha önce hiç kullanılmamış olan M_54 seçeneği var,
- K _268 için daha önce kullanılmamış M_51 seçeneği var,
- K_275 için daha önce kullanılmamış M_35 seçeneği var,
- K_300 için yine daha önce kullanılmamış M_48 seçeneği var,

Benzer durum, makronun atayabilecek iken ( seçenekler arasında olmasına rağmen ) atamadığı M_26, M_29, M_33, M_34, M_35, M_43, M_48, M_51, M_52, M_53, M_54 ve M_55 isimli makineler var.

Oysa makrodan beklentim;

MAKRO ilgili sütunda satır satır işlem yaptığına göre; makronun başka seçenek kalmadığında daha önceki satırlarda kullanılmış makine ismini getirmesi, seçenek varsa aynı makine ismini getirmemesiydi.

İnşallah bunu sağlayacak bir kod değişikliği mümkün olur.

Lütfen destek. Kod yazma işinden de pek anlamıyorum çünkü.
 
Son düzenleme:
Mevcut Kodda Nasıl Bir Değişiklik Yapmalı ?

Aşağıdaki vba kod'da ;
- başka seçenek kalmadığında daha önceki satırlarda kullanılmış makine ismini getirmesi,
- seçenek varsa aynı makine ismini getirmemesini
sağlamak için ne yapmalıyım.


Aşağıdaki kod, O - BQ sütunları arasındaki 55 seçenekten, maalesef sadece birinci seçeneği getiriyor.

Kod:
[B]Sub sec()[/B]
Dim MSTFM, MSTF, MM, XX1, MSTF2, NNN, NNN1, MMNNM
MM = 7
[B4] = " İşlem Yapılırken Lütfen Bekleyiniz !... "
Sheets("HESAP").Range("A7:A65536").ClearContents
Sheets("HESAP").Range("M7:M65536").ClearContents

For MSTFM = 7 To Sheets("HESAP").Cells(65536, "E").End(xlUp).Row
XX1 = 1
MMNNM = 1
For MSTF = 15 To 69
ZZ = Sheets("HESAP").Cells(MSTFM, MSTF)

If ZZ <> "" Then
For MSTF2 = 7 To MM
If Sheets("HESAP").Cells(MSTF2, "M") = ZZ Then
GoTo Gel
End If
Next

If XX1 = 1 Then
XX1 = MSTF * 1
End If
End If
Gel:
Next

If XX1 = 1 Then
For NNN = 7 To MM
For NNN1 = 15 To 69
If Sheets("HESAP").Cells(NNN, "M") = Sheets("HESAP").Cells(MSTFM, NNN1) Then
Sheets("HESAP").Cells(MSTFM, "M") = Sheets("HESAP").Cells(MSTFM, NNN1)
GoTo Gle
End If
Next

If Sheets("HESAP").Cells(MSTFM, "M") = "" Then
Sheets("HESAP").Cells(MSTFM, "M") = Sheets("HESAP").Cells(MSTFM, 15)
GoTo Gle
End If

Next

Else
Sheets("HESAP").Cells(MSTFM, "M") = Sheets("HESAP").Cells(MSTFM, XX1)
End If
Gle:
For MNMN = 7 To MM
If Sheets("HESAP").Cells(MSTFM, "M") = Sheets("HESAP").Cells(MNMN, "M") Then
Sheets("HESAP").Cells(MSTFM, "B") = MMNNM
MMNNM = MMNNM + 1
End If
Next

Next

MsgBox "İşleminiz Tamamlanmıştır !..", vbExclamation, "BAŞLIK"
[B4] = ""
End Sub

İlgilenen arkadaşlara teşekkürler.
 
Son düzenleme:
Kod düzeltme konusunda herhangi bir öneri halen yok.

Düzeltme yerine, yeni kod da olabilir.


İlgilenen arkadaşlara teşekkürler.
 
Merhaba

Ekteki kodları denermisiniz.makine isimlerini yine aynı sayfadaki alandan alıyor 04.kal-mak eşleşmesi sayfasına bağlamadım eğer istediğiniz işlem bu ise o sayfaya bağlayarak kodları değiştirebilirim.

Kod:
Sub MakineSec()
son = Cells(Rows.Count, 2).End(3).Row
For i = 7 To son
If Not Cells(i, 5).Value = "" Then
If Cells(i, 70).Value = 1 Then
Cells(i, 13).Value = Cells(i, 15).Value
End If
End If
Next

For x1 = 7 To son
Adet = 500
konum = 0
If Cells(x1, 5).Value <> "" Or Cells(x1, 13).Value <> "" Then
For x2 = 15 To 15 + Cells(x1, 70).Value
say = WorksheetFunction.CountIf(Range("M7:M" & son), Cells(x1, x2).Value)
If say < Adet Then
Adet = say
konum = x2
End If
Next x2
Cells(x1, 13).Value = Cells(x1, konum).Value
End If
Next x1

End Sub
 
Hüseyin bey teşekkür ederim emeğiniz için, HESAP sayfasındaki verileri ben formülle getiriyordum (makine seçeneklerini), aslında excel belgemi hiç formül içermeyecek hale getirmeye çalışıyorum.

Hatta 04.kal-mak eşleşmesi sayfasında BE sütunundan sonraki sütunları nihai olarak yok etmem gerekecek. Yani makine seçeneklerinin HESAP sayfasında görünmesinin de bir önemi yok.
Eğer yazdığınız kod HESAP sayfasındaki E sütununda yer alan kalıp isimlerinden hareketle
04.kal-mak eşleşmesi sayfasında B'den itibarenki sütunlardaki seçeneklerden arama yapıp getirirse çok memnun olurum. Böyle olursa makine seçenek sayısı da esnek hale gelmiş olur.

Ayrıca makine seçenek sayısı 1 olanları kapsam dışında bırakıp (çünkü o zaman zorunluluk oluşuyor) makine seçeneklerinin bulunduğu sayfada aramayı ondan sonra başlatırsak makro hız da kazanacaktır.

Makine seçenekleri arasında yapılacak aramanın yönü için soru soran bir Msg görüntüleyip yapılan tercihe göre sağdan sola mı yoksa soldan sağa mı arama yapılacağının belirlenip kodun ona göre devam etmesi çok güzel olur tabi.


Yazdığınız kod için, tekrarlanan makine isimlerine ilişkin ayrıntılı test yapacağım, onun sonucunu da daha sonra size iletip tekrar yardım isteyebilirim sakıncası yoksa.

Sorduğunuz soruya nihai olarak EVET diyorum. Yani arama, HESAP sayfasındaki makine seçenekleri arasından değil 04.kal-mak eşleşmesi sayfasındaki seçenekler arasından yapılmalı.

İlgi ve destek için teşekkür ederim.
 
Hüseyin bey yazdığınız koddaki satırların karşısına o satırın işlevinin ne olduğu belirten kısa notlar yazabilirseniz, bizimde kendi kodlarımızı yazmaya çalışırken işimize yarar veya üzerinde değişiklik yapmayı denersem etkisinin ne olacağını öngörmemi sağlar. Çok zahmet olmayacaksa tabi.

Sağdan sola, soldan sağa şeklinde belirttiğim husus yerine belki de; HESAP sayfasının E sütunundaki kalıp isimlerinden hareketle 04.kal-mak eşleşmesi sayfasındaki makronun üzerinde işlem yapacağı (seçime konu makine isimleri) makine isimlerinin seçenekler arasında tekrarlanma sıklığı da bir kriter olarak kullanılabilir. Yani diyelim bir makine ismi 3 kalıbın seçenekleri arasında, başka bir makine ismi ise 10 kalıbın seçenekleri arasında. Buna makinenin kalıp esnekliği diyeyim.

Belki bu tekrarlanma sıklığı da bir kriter olabilir, makine çakışmasını azaltmak için.
 
Bu arada Ankara'dan olduğunuzu gördüm, ne iş yaparsınız acaba? Ben de Ankara'da devlet memuruyum ve bu çalışmayı kızım için yapıyorum.
İnşallah yüz yüze de görüşme imkanımız olabilir. Bu işlerle uğraştığınıza göre siz de yazılım gibi işlerle uğraşıyor olmalısınız ve yaşınız da en fazla 30'larda olmalı.
 
Yanlış görmüşüm İstanbullu imişsiniz. Kusura bakmayınız.
 
Yanlış görmüşüm İstanbullu imişsiniz. Kusura bakmayınız.

Dosyayı 04.kal-mak eşleşmesi sayfasından alıcak şekile gelicek şekilde ayarlamaya çalışacağım.


Dosya makine isimlerini seçerken sağdan veya soldan başlaması çok onemli değil orada yaptığım işlem öncelikle tek makine ile çalışacakları listeye ekliyorum.

Daha sonra sırası ile birden fazla makine kullanılan kalıplar için hangi makine daha az kullanılmışsa o makineyi bulup kullanılmasını sağlamaya çalıştım.

bu işlemi sıralı yaparsak sanırım daha iyi olucak. öncelikle tek makinede kullanılanları bulup sonra 2 makinede sonra 3 diye ilerleyelim.
 
Sanırım daha mantıklısı bu, gerçekten sağ olun, sizi uğraştırıyorum.
 
Sanırım daha mantıklısı bu, gerçekten sağ olun, sizi uğraştırıyorum.

Ekteki kodları test edermisiniz.


Bu arada meslek = Muhasebe
Yaş:32 :(


Kod:
Sub MakineSec()

Set s1 = Sheets("04.kal-mak eşleşmesi")
Set s2 = Sheets("HESAP")

son = s2.Cells(Rows.Count, 2).End(3).Row
For i = 7 To son

satr = s1.Range("A1:A550").Find(s2.Cells(i, 5).Value, LookIn:=xlValues, LookAt:=xlPart).Row

If Not s2.Cells(i, 5).Value = "" Then
If s1.Cells(satr, 57).Value = 1 Then
For x4 = 2 To 56
If s1.Cells(satr, x4).Value <> "" Then
s2.Cells(i, 13).Value = s1.Cells(satr, x4).Value
End If
Next x4
End If
End If
Next



For xx = 2 To 11
For x1 = 7 To son
Adet = 500
konum = 0
işlem = 0
satr = s1.Range("A1:A550").Find(s2.Cells(x1, 5).Value, LookIn:=xlValues, LookAt:=xlPart).Row

If xx = 11 Then
işlem = 5
ElseIf s1.Cells(satr, 57).Value = xx Then
işlem = 5
End If

If işlem = 5 Then
If s2.Cells(x1, 5).Value <> "" And s2.Cells(x1, 13).Value = "" Then
For x2 = 2 To 56
If s1.Cells(satr, x2).Value <> "" Then
say = WorksheetFunction.CountIf(s2.Range("M7:M" & son), s1.Cells(satr, x2).Value)
If say < Adet Then
Adet = say
konum = x2
End If
End If
Next x2
s2.Cells(x1, 13).Value = s1.Cells(satr, konum).Value
End If
End If

Next x1

Next xx

End Sub
 
Bu kodda sanırım makine seçenekleri HESAP sayfasından değil seçeneklerin yer aldığı sayfadan alınıyor, doğru mudur?
 
Bir önceki kod ile bu kod arasındaki fark tam olarak nedir acaba?
Son mesajda belirttiğimiz gibi önce 1 sonra 2 sonra 3 ...şeklinde seçenek sayıları itibariyle seçim yapmak şeklinde midir?
 
Bir önceki kod ile bu kod arasındaki fark tam olarak nedir acaba?
Son mesajda belirttiğimiz gibi önce 1 sonra 2 sonra 3 ...şeklinde seçenek sayıları itibariyle seçim yapmak şeklinde midir?

Evet bu kodlar 04.kal-mak eşleşmesi üzerinden verileri alıyor.
ve işlemleri soralı olarak 1 den 10 kadar mak sayısına göre yapıyor.
 
10 derken mevcut kalıplar için seçenek sayısının maksimumu mu 10 yoksa, sizin verdiğiniz sınır mı 10?

Yani seçenek sayısı 10'dan fazlaysa aynı aynı şekilde 11 seçeneği olan, 12 seçeneği olan ..... şeklinde devam ediyor mu?
 
Bunu 04. ..eşleşme sayfasındaki formülleri silebilmek için soruyorum.
 
Üretim sayfasının bulunduğu konuyla bağlantılı bir sıralama yapmam gerek ama onun için de sizi yormayayım, yeni konu açayım diyorum. Tabi tek elden çıkması ve konuyu anlamış birisi olarak ona da siz bakabilirseniz çok sevinirim.
 
10 derken mevcut kalıplar için seçenek sayısının maksimumu mu 10 yoksa, sizin verdiğiniz sınır mı 10?

Yani seçenek sayısı 10'dan fazlaysa aynı aynı şekilde 11 seçeneği olan, 12 seçeneği olan ..... şeklinde devam ediyor mu?

1 den 10 kadar olanları sıralı yapıyor. 10 dan fazla makinesi olanları sırasız işlem yapıyor.
Makronun daha fazla yavaşlamaması için bu şekilde ayarladım.

Arttırmak isterseniz aşağıdaki kodlarda koyu ile işaretleiğim sayıları artırmanız gerekir.

For xx = 2 To 11 'burdaki 11 20 yapıp aşağıdaki 11 de 20 yaparsanız 19 Makineye kadar sıralı yapacaktır.

For x1 = 7 To son
Adet = 500
konum = 0
işlem = 0
satr = s1.Range("A1:A550").Find(s2.Cells(x1, 5).Value, LookIn:=xlValues, LookAt:=xlPart).Row

If xx = 11 Then
işlem = 5
 
Teşekkürler.
 
Son düzenleme:
Geri
Üst