Hirdetés

2024. április 27., szombat

Gyorskeresés

Útvonal

Fórumok  »  OS, alkalmazások  »  Microsoft Excel topic (kiemelt téma)

Téma összefoglaló

Téma összefoglaló

  • Utoljára frissítve: 2023-11-13 08:31:56

LOGOUT.hu

A Microsoft Excel topic célja segítséget kérni és nyújtani Excellel kapcsolatos problémákra.
Kérdés felvetése előtt olvasd el, ha még nem tetted.

Összefoglaló kinyitása ▼

Hozzászólások

(#47901) Fire/SOUL/CD válasza ReSeTer (#47899) üzenetére


Fire/SOUL/CD
félisten

"Fel lehet valahogy használni egy funkción belüli változót a főmakróban?"
Nem. Bővebben.

Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)

(#47902) Czmorek válasza lappy (#47900) üzenetére


Czmorek
aktív tag

Így Lett jó:
=HA(D35-H45<0;" ";D35-H45)

Most ha negatívban lennénk akkor üres a mező.
Azt be tudjuk állítani, hogy 0,0 legyen ott?

(#47903) Fferi50 válasza Fire/SOUL/CD (#47901) üzenetére


Fferi50
őstag

Szia!
Megfelelő kódfelépítéssel igen, de nem kifejezetten ajánlatos. A példát látod a képen:

Itt egy modulban van a függvény és a főprogram.
Ahhoz, hogy egy függvényben számolt változó értéket kapjon, a változót publikusnak kell definálni a modul elején, eljáráson kívül, majd meg kell hívni hozzá a függvényt, ezt látod a sárgával jelölt sorban.
Üdv.

(#47904) Fferi50 válasza Fire/SOUL/CD (#47901) üzenetére


Fferi50
őstag

Szia!
Téves az az információd, hogy a modul elején publikusnak definiált változót csak az a modul tudja használni, amelyben definiálták. Mivel publikus, így valamennyi eljárás hozzá tud férni, ehhez meg kell adni a teljes nevét, ami Modulnév.Változónév forma és így bármilyen másik modul is tudja használni, sőt a globális modulok, amelyek nem egy-egy objektumhoz (munkalap, userform stb.) kapcsolódnak, a Modulnév nélküli változót is tudják használni.
Amire te gondolsz az a modul elején DIM utasítással létrehozott modulszintű változó. Az valóban csak az adott modulban használható.
Üdv.

(#47905) Fire/SOUL/CD válasza Fferi50 (#47903) üzenetére


Fire/SOUL/CD
félisten

Amit itt a képeden bemutatsz, azt raktam ki én is képben (Public deklaráció (meg még mást is))... Persze, hogy úgy már lehet vele dolgozni bárhonnan :B

"Téves az az információd, hogy a modul elején publikusnak definiált változót csak az a modul tudja használni, amelyben definiálták. Mivel publikus,... "

Ööö a MyGlobalVariable_2 az Private deklaráció(tehát NEM Publikus, szvsz ezen átsiklottál :B), ergó sem más modulból, sem woorksheet kódból nem lehet elérni, csak abból a modulból, ahol deklarálva van (Én erről írtam, azt, amit, nem a publikus változóról)... :N
Modulnév.változónév formában sem (szerkesztő el fogja fogadni, engedi beírni, nem nyaffog miatta, de ha futtatni próbálod a makrót, akkor jön a hiba

[ Szerkesztve ]

Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)

(#47906) Czmorek válasza lappy (#47900) üzenetére


Czmorek
aktív tag

Köszönöm! :D
Megoldottam a maradékot.

(#47907) Fferi50 válasza Fire/SOUL/CD (#47905) üzenetére


Fferi50
őstag

Szia!
Lehet, hogy félreértettem valamit.
Volt egy ilyen mondatod: A modulban deklarált ugyanilyen nevű változó, csak a modulban található kódok számára látható.
Üdv.

(#47908) Fire/SOUL/CD válasza Fferi50 (#47907) üzenetére


Fire/SOUL/CD
félisten

Igen, azt értetted félre, amit most leírtál...
A Module1-ben Private-ként deklarált MyGlobalVariable_2 változóhoz, csak a Module1-ben található funkciók/eljárások férnek hozzá, Module1-en kívüli kódok (bárhol is legyenek) meg nem.

Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)

(#47909) NdrewSunix


NdrewSunix
senior tag

Hello srácok!

Van nekem egy szép nagy táblázatom, sok oszloppal és sorral, benne sok képlettel.
Milyen módon tudnám egyszerűbben ellenőrizni, hogy valamely oszlopban van-e esetleg #HIÁNYZIK képlethiba, a szűrős egyesével lenyitogatós és legalulra tekergetés helyett?

Köszi előre is a segítséget!

(#47910) lappy válasza NdrewSunix (#47909) üzenetére


lappy
őstag

példa

Bámulatos hol tart már a tudomány!

(#47911) Fire/SOUL/CD válasza NdrewSunix (#47909) üzenetére


Fire/SOUL/CD
félisten

HAHIÁNYZIK függvény.

Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)

(#47912) NdrewSunix válasza lappy (#47910) üzenetére


NdrewSunix
senior tag

Ez magyarul hogy néz ki? =MIN(IF(ISERROR(A1:Z100),ROW(A1:A100)))

#47911Fire/SOUL/CDNdrewSunix
Nekem úgy kellene igazából, hogy egy cellába írja be, hogy talált #HIÁNYZIK eredményt egy adott tartományban.
Ennél a hahiányziknál az összes cellát eredményül adta egy újabb óriási táblázatban.

(#47913) Fire/SOUL/CD válasza NdrewSunix (#47912) üzenetére


Fire/SOUL/CD
félisten

Ja, hogy ja...

Megszámolod, hogy az adott tartományban hány cella tartalmaz #HIÁNYZIK hibát, nyilván ha 0, akkor nincs egy sem a tartományban, ha meg nagyobb mint 0, akkor meg van.

=HA(DARABTELI(B1:B5;HIÁNYZIK());"Van hiba";"Nincs hiba")

[ Szerkesztve ]

Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)

(#47914) NdrewSunix válasza Fire/SOUL/CD (#47913) üzenetére


NdrewSunix
senior tag

Köszönöm, ez így megfelelő lesz nekem!

(#47915) eszgé100 válasza Fferi50 (#47894) üzenetére


eszgé100
őstag

1.) pontosan,  ott nem kell bezárni a fájlt, mert még a ciklus későbbi lépéseiben még szükség lesz rájuk, pl amikor egy workbookban van 20 worksheet,  de nem egyszerre ömlesztve akarom őket kinyomtatni, mert utána akkor még kézzel is le kell válogatnom később, amit nem szeretnék. A Save&Close oszlop celláinak értéke az =IF(COUNTIF(D2:INDIRECT("D" & COUNTIF(D:D,"<>")),D2)>1,"no","yes") függvénnyel van meghatározva, ami eddigi tesztjeim alapján dinamikusan változik, amikor ugyanaz az elérési útvonal kerül a Path oszlop celláiba. Amennyiben az adott elérési útvonal nem ismétlődik többet a maradék cellatartományban az érték Save&Close "yes"-re változik és a workbook ment és bezárul

2a.) mi pontosan a hátránya, hogyha GoTo-val ugrálok? 
2b.) Másik ezzel kapcsolatban, hogy a Mod funkció működését nem teljesen értem, legalábbis az én esetemben. Pl ha "6 monthly"-t keresem, akkor azokat a hónapokat keresem, amelyeket 6-al oszthatóak maradék 1-el? Ez január és július esetében (1/6= 0 maradék 1) és (7/6=1 maradék 1), "yearly" pedig (1/12=0 maradék 1)?
2c.) címkéket megszűntettem if - end if-eket használva 

3.) hibakezelés, pl valami létfontosságú cella nincs kitöltve. Szűrést pedig úgy értem, hogy  kézzel leszűröm az adatokat, majd arra eresztem rá a makrót, hiba a Save&Close-nál van, mert olyankor is a maradék tartományt figyeli, mikor az egyébként a szűrés miatt nem látszik.

+ A kódhoz hozzáadtam egy response-t, ami a user arcába tolja, hogy a makró milyen nyomtatókat fog használni, mindkettőt le kell okézni, csak így kerül az ellenörző cellába, ahonnan a makró majd használja. Ha valamelyik cella üres, akkor a kód megáll, és informálja a usert. Ezen kívül még hozzáadtam egy manual update oszlopot is az adattáblán, alapból ki van kapcsolva, de ha "yes" az értéke, akkor csak megnyitja a workbookot, majd megy tovább a ciklus, valamint egy néhány sort, hogy szűrést és manual update-et alaphelyzetbe állítsa miután a fájl megnyílik.

így néznek ki:

Sub Auto_Open()

Dim start As Date
Dim weekcom As Date
Dim today As Date
Dim response As VbMsgBoxResult

Dim lo As ListObject
Dim ws As Worksheet, ma As Worksheet
Dim lastrow As Long


Set lo = Worksheets("OpenClose").ListObjects(1)
lo.AutoFilter.ShowAllData

Set ma = Workbooks("FillerPrinter.xlsm").Worksheets("MainAssembly")
'ma.Unprotect "123"

Set ws = Workbooks("FillerPrinter.xlsm").Worksheets("OpenClose")
lastrow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row
ws.Range("P2:P" & lastrow) = "no"



Worksheets("MainAssembly").Activate
Range("A1").Select

start = Sheets("MainAssembly").Range("F3").Value
today = Sheets("MainAssembly").Range("F7").Value
weekcom = start
Do While weekcom < today
weekcom = weekcom + 28
Loop
Sheets("MainAssembly").Range("F6").Value = weekcom

Dim Printers() As String
Dim N As Long
Dim S As String
Dim col As String
Dim bw As String

Printers = GetPrinterFullNames()

Sheets("MainAssembly").Range("F8:F9").Value = ""


For N = LBound(Printers) To UBound(Printers)
S = Printers(N) 'S & Printers(N) & vbNewLine
If InStr(S, "Microsoft") <> 0 And InStr(S, "Print") <> 0 Then col = S
If InStr(S, "HP Photosmart Wireless B109n-z") <> 0 And InStr(S, "Print") = 0 Then bw = S
Next N

response = MsgBox(col, vbOKCancel, "Confirm the Colour Printer")
If response = vbOK Then
Sheets("MainAssembly").Range("F8").Value = col
Else: MsgBox "Stop-Call-Wait", vbOKOnly
Exit Sub
End If

response = MsgBox(bw, vbOKCancel, "Confirm the B&W Printer")
If response = vbOK Then
Sheets("MainAssembly").Range("F9").Value = bw
Else: MsgBox "Stop-Call-Wait", vbOKOnly
Exit Sub
End If
'ma.Protect "123"
End Sub

Sub EOM_Main_Assy_Workbooks()

'loop:
Dim sPath As String, ssheet As String, fileName As String
Dim lastrow As Long, counter As Long
Dim ws As Worksheet, tp As Worksheet, ma As Worksheet
'print:
Dim bw As String, col As String
Dim toprint As Boolean
'from main worksheet:
Dim sDate As String
Dim sWeek As String
Dim sWkcom As String
Dim nextmonth As Date
'from Table:
Dim freq As String
Dim area As String
Dim loc As String
Dim dat As String
Dim week As String
Dim wkcom As String
Dim procloc As String
Dim procname As String
Dim machloc As String
Dim machname As String
Dim printer As String
Dim copies As Integer
Dim saveandclose As String
Dim manual As String
Dim manualcheck As Boolean

sDate = "=[FillerPrinter.xlsm]MainAssembly!$F$4"
sWeek = "=[FillerPrinter.xlsm]MainAssembly!$F$5"
sWkcom = "=[FillerPrinter.xlsm]MainAssembly!$F$6"

Set ma = Workbooks("FillerPrinter.xlsm").Worksheets("MainAssembly")

nextmonth = ma.Range("F4")
col = ma.Range("F9")
bw = ma.Range("F9")

'1st condition
If ma.Range("F8") = "" Or ma.Range("F9") = "" Then
MsgBox prompt:="One or both printers are not selected." & VBA.Constants.vbNewLine & "Please click on Update / Reset button!" & VBA.Constants.vbNewLine & "If not sure, please S-C-W!"
Exit Sub
End If
'End of 1st condition

Set ws = Workbooks("FillerPrinter.xlsm").Worksheets("OpenClose")

lastrow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row
counter = 2
manualcheck = False

Do While counter <= lastrow

'2nd condition
If Not ws.Range("A" & counter).EntireRow.Hidden Then

freq = ws.Range("A" & counter)
area = ws.Range("B" & counter)
loc = ws.Range("C" & counter)
sPath = ws.Range("D" & counter)
ssheet = ws.Range("E" & counter)
dat = ws.Range("F" & counter)
week = ws.Range("G" & counter)
wkcom = ws.Range("H" & counter)
procloc = ws.Range("I" & counter)
procname = ws.Range("J" & counter)
machloc = ws.Range("K" & counter)
machname = ws.Range("L" & counter)
printer = ws.Range("M" & counter)
copies = ws.Range("N" & counter)
saveandclose = ws.Range("O" & counter)
manual = ws.Range("P" & counter)

'freq check

Select Case CStr(freq)
Case "4 weekly", "monthly"
toprint = True
Case "2 monthly"
toprint = Month(nextmonth) Mod 2 = 1
Case "3 monthly"
toprint = Month(nextmonth) Mod 3 = 1
Case "6 monthly"
toprint = Month(nextmonth) Mod 6 = 1
Case "yearly"
toprint = Month(nextmonth) Mod 12 = 1
End Select

'open sheets
'3rd condition
If toprint Then
Application.ScreenUpdating = True
ma.Visible = True

fileName = Right(sPath, Len(sPath) - InStrRev(sPath, "\"))
Application.StatusBar = "Processing File: " & fileName
Application.ScreenUpdating = False

Workbooks.Open sPath
Windows(fileName).Visible = False

'4th condition
If CStr(manual) = "no" Then

'update sheets if necessary
If CStr(dat) <> "" Then Workbooks(fileName).Sheets(ssheet).Range(dat).Formula = sDate
If CStr(week) <> "" Then Workbooks(fileName).Sheets(ssheet).Range(week).Formula = sWeek
If CStr(wkcom) <> "" Then Workbooks(fileName).Sheets(ssheet).Range(wkcom).Formula = sWkcom
If CStr(procloc) <> "" Then Workbooks(fileName).Sheets(ssheet).Range(procloc).Formula = procname
If CStr(machloc) <> "" Then Workbooks(fileName).Sheets(ssheet).Range(machloc).Formula = machname


'print sheets
Set tp = Workbooks(fileName).Worksheets(CStr(ssheet))

Select Case CStr(printer)
Case "col"
Application.ActivePrinter = col
tp.PrintOut copies:=CStr(copies)
Case "bw"
Application.ActivePrinter = bw
tp.PrintOut copies:=CStr(copies)
Case Else
MsgBox "No printer selected"
End Select

'wait here a bit

Do While ActiveWindow.View = xlPrint
Loop

'time to save&close
If CStr(saveandclose) = "yes" Then Excel.Workbooks(fileName).Close SaveChanges:=True



Else:
'Windows(fileName).Visible = True
manualcheck = True

'End of 4th condition
End If

'End of 3rd condition
End If

'End of 2nd condition
End If

counter = counter + 1
Loop

Application.StatusBar = "Done!"
Application.ScreenUpdating = True

ma.Activate
Range("A1").Select

If manualcheck = True Then
MsgBox "Update and print the sheets manually"
Else: MsgBox "Done!"
End If

End Sub

"-Meddig tart a játék? -Amíg mindenkinek ki nem verik a fogát..."

(#47916) Fferi50 válasza eszgé100 (#47915) üzenetére


Fferi50
őstag

Szia!
1.)"a ciklus későbbi lépéseiben még szükség lesz rájuk, pl amikor egy workbookban van 20 worksheet, de nem egyszerre ömlesztve akarom őket kinyomtatni,"
ugyanakkor a ciklusban minden sornál ott van a Workbooks.Open, anélkül, hogy megnéznéd, nincs-e már megnyitva az adott file.
"mert utána akkor még kézzel is le kell válogatnom később"
másrészt, ha egy következő file másik munkalapját nyomtatod utána, akkor nem kell kézzel leválogatni az előzőtől?
2.a) szerintem alapvetően akkor van szükség GoTo utasításra, ha a makró/folyamat rosszul van megtervezve, megszervezve. Az ugrálás rontja az áttekinthetőséget és szerintem lassítja is a végrehajtást. Egy esetben látom indokoltnak, a futási hibák kezelésénél, ott ahol a hiba természete miatt külön hibakezelési rutinra van szükség az adott makrón belül. (Lásd: On Error Goto .. utasítás ).
2.b) Mod funkció -> egy osztás maradék eredményét adja vissza. Nálad azért 1 a feltétel értéke, mert mindig az adott ciklus utáni első hónapban nyomtatod a munkafüzetet (vagy ha úgy jobban tetszik, a ciklus első hónapjában). 3 havonta esetén az 1,4,7,10 hónapban. De mondhatnád azt is, hogy a 3,6,9,12 hónapban akarod nyomtatni, akkor a 0 maradék lenne a feltétel. Tehát te döntöd el, melyik hónapban kezdődjön a nyomtatási ciklus és a maradékot annak megfelelően használod feltételnek. Ugyanez igaz a többi ciklikus feltételre is.
3.a) Hibakezelésen tehát a felhasználói hibák vizsgálatát érted (amivel egyrészt megelőzheted fals adatok dokumentálását, másrészt program futási hibák keletkezését). Azt gondolom, erre az esetre érdemes egy külön függvényt írni, ami megizsgálja a kritikus összefüggéseket és logikai értéket ad vissza a vizsgálat eredményéről, amitől függően megy tovább a ciklus vagy elengedi azt a munkafüzetet/lapot.
Érdemes ettől függően azon is gondolkodni, hogyan kezeljük a futás idejű hibákat, mivel nem szeretnénk, ha ezek miatt utólag kellene a felhasználókkal hibát javíttatni.
3.b) Szűrés esetén a Darabteli függvény nincs tekintettel a szűrt állapotra valóban. Ebben az esetben a Save&close cella tartalma helyett meg kell nézned a szűrt területet makróval.
A D oszlop szűrt tartományát a következőképpen kapod meg:
ActiveSheet.UsedRange.Columns("D").SpecialCells (xlCellTypeVisible)
A Find metódussal meghatározhatod a keresett érték helyét.
Dim scrange As Range
Majd a nyomtatás után:
Set scrange=ActiveSheet.UsedRange.Columns("D").SpecialCells (xlCellTypeVisible).Find(what:=sPath,after:=Range("D" & counter))
If scrange.Row<=counter then --- save & close
Mivel nincs további találalat a szűrt tartományban, ezért az első találatra fog visszaugrani.
Üdv.

(#47917) Delila_1 válasza Fferi50 (#47916) üzenetére


Delila_1
Topikgazda

Szerintem semmi gond a Go To utasítással. Az áttekinthetőséget a tabulátorok adják. Az ugrás címe mindig a 0 pozícióban van, az összes többi ettől jobbra.
Nagy időt a feltételek vizsgálata igényel ismereteim szerint.

Az összetartozó részek is szépen látszanak egy normális tagolásnál.
    If Range("A1") > 0 Then
        Range("B1") = 10
    Else
        Range("B1") = 20
    End If

[ Szerkesztve ]

Programozó: hibás programok megírására és kijavítására kiképzett szakember. Többet ésszel, mint ész nélkül.

(#47918) Fferi50 válasza Delila_1 (#47917) üzenetére


Fferi50
őstag

Szia!
Ebben hol az ugrás?
Üdv.

(#47919) Delila_1 válasza Fferi50 (#47918) üzenetére


Delila_1
Topikgazda

Ez csak azt mutatja, hogy tabulálással jól lehet láttatni az összetartozó egységeket. Hibakezeléssel:

If Range("A1") > 0 Then
Go To Hiba
Else
Range("B1") = 20: Exit Sub
End If

Hiba:
MsgBox "..."
On Error GoTo 0

Egy rossz példa találomra erről a fórumról:
Select Case CStr(freq)
                Case "4 weekly", "monthly"
                     nyomtatni = True
                 Case "2 monthly"
                 nyomtatni = Month(nextmonth) Mod 2 = 1
                 Case "3 monthly"
                 nyomtatni = Month(nextmonth) Mod 3 = 1
            End Select

[ Szerkesztve ]

Programozó: hibás programok megírására és kijavítására kiképzett szakember. Többet ésszel, mint ész nélkül.

(#47920) Fferi50 válasza Delila_1 (#47919) üzenetére


Fferi50
őstag

Szia!
Én nem a program leírás áttekinthetőségére gondoltam - persze az is nagyon fontos, hanem a folyamatra magára.
Természetesen a bemásolt programok tabulálása is fontos, de sajnos a szerkesztő nem igazán támogatja ezt és igen, előfordul figyelmetlenség is.
Ráadásul a Go To példád pont a hibakezeléssel kapcsolatos, amire én is azt írtam, hogy néha nem is oldható meg másként. :)
Mivel az utasításkészlet tartalmazza a Go To szerkezetet, programozási stílus függő is lehet az alkalmazása.
Üdv.

[ Szerkesztve ]

(#47921) Delila_1 válasza Fferi50 (#47920) üzenetére


Delila_1
Topikgazda

Ezt úgy értettem:
Az ugrálás rontja az áttekinthetőséget és szerintem lassítja is a végrehajtást.
Eszerint félreértettem.

[ Szerkesztve ]

Programozó: hibás programok megírására és kijavítására kiképzett szakember. Többet ésszel, mint ész nélkül.

(#47922) Fferi50 válasza Delila_1 (#47921) üzenetére


Fferi50
őstag

:)

(#47923) eszgé100 válasza Fferi50 (#47916) üzenetére


eszgé100
őstag

1a.) megnyitott fájlok ellenőrzésének gondolata már piszkálta nekem is a fantáziám, de bevallom, lusta disznó voltam foglalkozni vele, pedig egy nem túl bonyolult IsFileOpen funkciót használva 9 másodperccel lett gyorsabb.

1b.) valószínűleg a későbbiekben sorszámozva leszek a sheetek, hogy a fizikai lokáció szerinti sorrendben legyenek kinyomtatva, így egy helyszínre csak egyszer kell ellátogatni anélkül, hogy időt pocsékolnék a papírok válogatásával, de ezt még nem találtam ki pontosan, hogy hogy legyen.

3a.) még tesztelnem és gugliznom kell, hogy tovább kommenteljem
3b.) Save & Close most ilyen lett:

'time to save&close
Set scrange = ws.UsedRange.Columns("D").SpecialCells(xlCellTypeVisible).Find(what:=sPath, after:=Range("D" & counter))

If scrange.Row <= counter Then
Excel.Workbooks(fileName).Close SaveChanges:=True

ElseIf manualcheck = False & CStr(saveandclose) = "yes" Then Excel.Workbooks(fileName).Close SaveChanges:=True
End If

amivel annyi problémám van, hogyha így állítom be az értékeket, akkor bezáródik, hiába volt "yes" valamelyik cella a Manual Update oszlopban

ha a manualcheck-et is beteszem az első feltételbe, akkor run time error-t kapok

[ Szerkesztve ]

"-Meddig tart a játék? -Amíg mindenkinek ki nem verik a fogát..."

(#47924) Fferi50 válasza eszgé100 (#47923) üzenetére


Fferi50
őstag

Szia!
Szerintem először nézd meg a Manual Update értékét.
If Not manualcheck Then
Set scrange=ws.UsedRange.Columns("D").SpecialCells(xlCellTypeVisible).Find(what:=sPath, after:=Range("D" & counter))
If scrange.Row <= counter Then Excel.Workbooks(fileName).Close SaveChanges:=True
End If

Sőt, tulajdonképpen a keresési eredményt közvetlenül is lehet használni:
If ws.UsedRange.Columns("D").SpecialCells(xlCellTypeVisible).Find(what:=sPath, after:=Range("D" & counter)).Row <= counter Then Excel.Workbooks(fileName).Close SaveChanges:=True
mivel legalább az adott sorban levő tételt meg fogja találni, tehát hibát nem okozhat a találat hiánya.
Üdv.

[ Szerkesztve ]

(#47925) Fferi50 válasza eszgé100 (#47923) üzenetére


Fferi50
őstag

Ha jól látom, akkor a manualcheck változód a ciklus során nem változik, illetve a manual "Yes" esetén True lesz. Ez ugye szűrésnél rendben is van, de ha nincs szűrés, akkor egyetlen kézi ellenőrzésre szoruló tábla is megakasztja az összes többi bezárását is.
Ha jól gondolom, akkor a szűrés nélküli állapotban meg kellene vizsgálni, hogy az adott fájlhoz tartozik-e olyan sor, amelyben kézimunka szüksége.
Ezt a Countifs függvénnyel lehet megnézni szerintem, első feltétel a fájl neve a D oszlopon, második feltétel a yes a Manual Update oszlopon. Ha ez nem 0, akkor nem lehet a fájlt bezárni.
Üdv.

(#47926) hódmaci


hódmaci
senior tag

Sziasztok!

Van olyan trükk amivel azt lehet beállítani, ha új lapot nyitok akkor az új lap neve ne az legyen hogy "Munka1" hanem a mai dátum. (ÉV.Hó.nap.)

Hölgyeim! Azt tesszük a kirakatba ami eladó.:)

(#47927) lappy válasza hódmaci (#47926) üzenetére


lappy
őstag

így megoldható

Bámulatos hol tart már a tudomány!

(#47928) Fire/SOUL/CD válasza hódmaci (#47926) üzenetére


Fire/SOUL/CD
félisten

ThisWorkbook-ba kerül a kód

Private Sub Workbook_NewSheet(ByVal Sh As Object)

Dim MyDate As String

MyDate = Format(Now, "yyyy.mm.dd - hh:mm:ss")
Sh.Name = MyDate

End Sub

[ Szerkesztve ]

Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)

(#47929) Fferi50 válasza lappy (#47927) üzenetére


Fferi50
őstag

Szia!
Automatizálni lehet, ha a Thisworkbook Workbook_NewSheet eseménykezelőjébe építjük be a makrót.
Természetesen utána a munkafüzetet makróbarátként vagy binárisként kell menteni.
Üdv.

(#47930) hódmaci válasza Fire/SOUL/CD (#47928) üzenetére


hódmaci
senior tag

Szuper.

Esetleg megoldható még, hogy az előfej elő-láb mező mindig a lap neve legyen?

Vagy pl az A1 mező legyen midig a lap neve
Nem jó ha a =MA() függvényt használom mert akkor mindig az a dátum lesz ott amelyik napon megnyitom. (Azt hiszem.)

Illetve, hogy az új lapon mindig az az adott mentett sablonom jelenjen meg.

Elnézést ha sok vagyok. :D

[ Szerkesztve ]

Hölgyeim! Azt tesszük a kirakatba ami eladó.:)

(#47931) Fire/SOUL/CD válasza hódmaci (#47930) üzenetére


Fire/SOUL/CD
félisten

Közben javítottam/módosítottam az előző hozzászólásom, mert ha a Date függvénnyel dolgoznánk, akkor az első munkalapot létrehozná a mai dátummal, de még egyet (ugyanazon a napon) már nem, mert 2 egyforma nevű munkalap nem lehet.

"Esetleg megoldható még, hogy az előfej elő-láb mező mindig a lap neve legyen?"
Mármint mindkettő szerepeljen a munkalap nevében?
Megoldható, csak a munkalap neve max. 31 karakter lehet, ha hosszú az előfej és élőláb + még az ilyen hosszú dátum- és időformátum, az úgy már nem minden esetben fog menni...
A dátumidőt még össze lehet "tömöríteni", pl 211202110150 formátumba 2021. 12 .02. - 11:01:50 helyett...

[ Szerkesztve ]

Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)

(#47932) hódmaci


hódmaci
senior tag

Hogy volt az eredeti kód?
Mert ez abszolút nem működik így.
Nem tudok új lapot nyitni.
Egy lapom van nyitva aminek a neve "2021.01.01." Így próbálok új lapot nyitni

Ezt a sort hozza hibára sárga nyillal:Vastag aláhúzott

Private Sub Workbook_NewSheet(ByVal Sh As Object)
    
Dim MyDate As String
    MyDate = Format(Now, "yyyy.mm.dd - hh:mm:ss")
    Sh.Name = MyDate
    
End Sub

sh.Name = Mydate

[ Szerkesztve ]

Hölgyeim! Azt tesszük a kirakatba ami eladó.:)

(#47933) lappy válasza hódmaci (#47930) üzenetére


lappy
őstag

A1 mező legyen a lap neve:
=KÖZÉP(CELLA("filenév";A1);SZÖVEG.TALÁL("]";CELLA("filenév";A1))+1;255)

Bámulatos hol tart már a tudomány!

(#47934) Fire/SOUL/CD válasza hódmaci (#47932) üzenetére


Fire/SOUL/CD
félisten

Bocs, csak mint a Hungaroringen a boxutcába, úgy jönnek sorba a futárok hozzánk... :DDD

Igen, mert hüle voltam, megfeledkeztem róla, hogy bizonyos karaktereket nem lehet munkalap nevében felhasználni... Bocsesz ( csak tényleg ki-be rohangálok egy ideje a futárokhoz)

Mindjárt megírom újra.

Még csak annyit, hogy egy újonnan létrehozott munkalapnak még nincs sem élőfeje, sem élőlába, tehát nincs mit az éppen létrehozás alatt álló munkalap nevébe beilleszteni.

Esetleg úgy értetted, hogy a makró adjon az újonnan létrehozott munkalaphoz élőfejet meg élőlábat? :U Az alábbi kód ezt teszi.

'Fire/SOUL/CD - 2021

Private Sub Workbook_NewSheet(ByVal Sh As Object)

Dim MyDate As String
Dim MyStr As String

'megadjuk a dátum- és időformátumot
MyDate = Format(Now, "yymmdd_hhmmss")

'beállítjuk az összes élőfej és élőláb szövegét
'természetesen amelyikre nincs szükség,
'azt a sort törölheted vagy kommentezd ki
With Sh
.PageSetup.LeftHeader = "Élőfej BAL"
.PageSetup.CenterHeader = "Élőfej KÖZÉP"
.PageSetup.RightHeader = "Élőfej JOBB"
.PageSetup.LeftFooter = "Élőláb BAL"
.PageSetup.CenterFooter = "Élőláb KÖZÉP"
.PageSetup.RightFooter = "Élőláb JOBB"
End With

'melyik élőfej vagy élőláb szövegét tartalmazza a munkalap neve
'itt a példában a középső élőfejét
MyStr = Sh.PageSetup.CenterHeader

Sh.Name = MyStr & "_" & MyDate

End Sub

[ Szerkesztve ]

Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)

(#47935) hódmaci válasza Fire/SOUL/CD (#47934) üzenetére


hódmaci
senior tag

Jobb lesz ha hosszabban leírom mit is szeretnék mert nem szeretném ha fölösleges köröket futna velem bárki is. :)

Amit szeretnék:

Készíteni szeretnék egy adott lapot ami nevekkel jelenléti felsorolást tartalmaz.
Illetve elvégzett munkálatokat
Afféle műszaknapló

Adott névhez adott jelenlét x-elhető.
(beteg, jelen, szabi, egyéb)

Ezeket kitöltöm ma és elmentem.
Holnap megnyitom és vissza tudom keresni dátum szerint ki volt aznap és mit csinált a csapat.
Illetve egyben nyitnák egy új lapot aminek a neve az aznapi dátum illetve a lap tartalma az kitöltetlen jelenléti ív.
Vagyis csak neveket tartalmaz és én beírom ki van ki nincs illetve az aznapi munkát.
Másnap kezdődik előröl.
Új lap ami kitöltve előre az adott nevekkel én beírom aznap ki van ki nincs stb....
pm küldtem képet

lappy
Köszönöm.
Működik

Hölgyeim! Azt tesszük a kirakatba ami eladó.:)

(#47936) Fferi50 válasza hódmaci (#47935) üzenetére


Fferi50
őstag

Szia!
Miért kell minden napra külön munkalap? Egy munkalap egy hónap.
Az oszlopokban lehetne a napokat megjeleníteni.
Az Excel sablonjaiban is találhatsz jelenléti íveket.
Üdv.

(#47937) hódmaci válasza Fferi50 (#47936) üzenetére


hódmaci
senior tag

Egy munkalapra egy napot szeretnék megjeleníteni.
Így egy munkafüzet egy egész hónap lesz majd.
Számomra így könnyebb lenne a visszakeresés ha szükségem lenne valamire.
Azonkívül az elvégzett munkát is könnyebb volna társítanom adott naphoz és dolgozókhoz.

Hölgyeim! Azt tesszük a kirakatba ami eladó.:)

(#47938) Fire/SOUL/CD válasza hódmaci (#47935) üzenetére


Fire/SOUL/CD
félisten

Ööö, ehhez nem kell makró, mert ez 10 másodperces munka max... ;]
Csinálsz egy munkalapot, aminek pl. Üres jelenléti ív nevet adsz (mert az az üres jelenléti ívet tartalmazza), CTRL nyomvatart, egérrel megfogod a munkalapot és elhúzod (lesz egy másolat, azon duplaklikk és átírod a nevét a megfelelő dátumra és kész...
(vagy az üres munkalapon jobb egér/áthelyezés vagy másolás...)

Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)

(#47939) ReSeTer


ReSeTer
senior tag

Bocsánat ha rossz topic, igazából VBA topic nincs, csak VB.

Hogyan tudnék egy Word dokumentumban található táblázatba új sort csinálni célzottan? Tehát ne a végére csináljon, hanem mondjuk megtudnám adni, hogy melyik sor alá.

wordobjektum.Tables(táblázatazonosító).rows.add

Itt tartok.

(#47940) Fferi50 válasza ReSeTer (#47939) üzenetére


Fferi50
őstag

Szia!
Talán nem a legelegánsabb, de műxik:
wordobjektum.Tables(táblázatazonosító).rows(x).Select
Selection.InsertRowsBelow

Üdv.

(#47941) csferke


csferke
senior tag

Sziasztok!
Mivel erre nem reagált senki, ismételten bátorkodom feltenni a kérdést.
Az kivitelezhető, hogy automatikusan változzon egy Munkalap neve?
Konkrétabban. "Név "+ egy másik lapon található cella tartalma, amely változik.

köszi
Angol Excel 2007

(#47942) Delila_1 válasza csferke (#47941) üzenetére


Delila_1
Topikgazda

A ThisWorkbook laphoz kell rendelned a makrót. Mikor egy új lapot hozol létre, az a Munka1 lap B3 cellájában lévő nevet kapja meg.

Private Sub Workbook_NewSheet(ByVal Sh As Object)
    ActiveSheet.Name = Sheets("Munka1").Range("B3")
End Sub

Programozó: hibás programok megírására és kijavítására kiképzett szakember. Többet ésszel, mint ész nélkül.

(#47943) Kowax


Kowax
tag

Sziasztok!

Adott két oszlopom mért értékekkel. Az egyiket diagramban ábrázolom a másik függvényében. Amire kíváncsi vagyok, hogy az ábrázolt diagram egy adott pontja (ami a maximális érték fele) hol metszi az X tengelyt,vagyis aminek a függvényében ábrázoltam. Nem tudom ez így mennyire érthető, kicsit késő van már. :DDD
Odáig jutottam, hogy a maximális érték felének értékével csináltam egy új oszlopot, azt is ábrázoltam a diagramban, így kaptam egy vízszintes egyenest, ami metszi az eredeti görbét. Na erre a metszéspontra lennék kíváncsi az X tengelyen.
Valaki tudna ebben segíteni? :F
Előre is köszönöm szépen! :R

Böff!:))

(#47944) csferke válasza Delila_1 (#47942) üzenetére


csferke
senior tag

Szia!
Mikor egy új lapot hozol létre, az a Munka1 lap B3 cellájában lévő nevet kapja meg.
Nem pontosan erre gondoltam. Pontosítok.
Meglévő munkalap nevét szeretném módosítani.
Adott egy "Név" ami nem változik és ehhez kellene hozzáadni a B3 tartalmát. Amikor változik B3 tartalma akkor változzon a munkalap neve "Név "+a B3 új tartalma.

köszi
Angol Excel 2007

(#47945) Delila_1 válasza Kowax (#47943) üzenetére


Delila_1
Topikgazda

Vegyél fel egy új sort és egy új oszlopot.
[kép]

Programozó: hibás programok megírására és kijavítására kiképzett szakember. Többet ésszel, mint ész nélkül.

(#47946) lappy válasza Kowax (#47943) üzenetére


lappy
őstag

Vmi ilyesmire gondoltál

Bámulatos hol tart már a tudomány!

(#47947) Delila_1 válasza csferke (#47944) üzenetére


Delila_1
Topikgazda

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim lapnev As String
    If Target.Address = "$B$3" Then
        Application.EnableEvents = False
        lapnev = "Állandó " & Range("L1")
        Sheets(lapnev).Name = "Állandó " & Range("B3")
        Range("L1") = Range("B3")
        Application.EnableEvents = True
    End If
End Sub

Első futtatás előtt írd be az L1-be az állandó szöveg utáni részt.

Programozó: hibás programok megírására és kijavítására kiképzett szakember. Többet ésszel, mint ész nélkül.

(#47948) Kowax válasza Delila_1 (#47945) üzenetére


Kowax
tag

Ez hogy oldja meg a problémámat? :F
Csatolok két képet. Az elsőn az adatok, a másodikon a diagram. A diagram kék vonalai és a narancssárga vonal metszéspontjainak X értékére vagyok kíváncsi. A kék vonalak adatai mérési eredmények. A narancssárga az adatok közül az utolsó oszlop, ami az adatok közül a maximális érték felét jelenti.
Na most itt akkor hogyan fogom megtudni a metszéspontokat egy új sor és oszlop felvételével? :F
Előre is köszönöm, ha elmagyarázod, mert ezt most nem látom át. :R

Böff!:))

(#47949) Kowax válasza lappy (#47946) üzenetére


Kowax
tag

Igen, valami ilyesmi jó lenne, de ahogy látom, ez egy külön program vagy kiegészítő. A sima mezei Excel-ben nem lehet megoldani?

Böff!:))

(#47950) Fferi50 válasza Kowax (#47948) üzenetére


Fferi50
őstag

Szia!
Kár, hogy a két képet nem csatoltad.
Ha vonaldiagramot csináltál, akkor pl. lehet esésvonalakat hozzáadni a Diagramtervezés menüben:

Esetleg tehetsz fel trendvonalat, annak az egyenletét, amiből ki lehet számoltatni a metszéspontot.
[itt találtam vba-s megoldást]
a lappy által mutatottra, ezt az adott munkafüzetbe lehet beépíteni. Utána makróbarátként kell elmenteni.
Üdv.

[ Szerkesztve ]

Útvonal

Fórumok  »  OS, alkalmazások  »  Microsoft Excel topic (kiemelt téma)
Copyright © 2000-2024 PROHARDVER Informatikai Kft.