excel в мрежа
20 отговора
0 прегледа
excel в мрежа
Налага се 1 файл да се ползва от доста хора едновременно (поне 8 човека в мрежа). Проблема е, че след като първия го отвори другите могат само да го четат. Опитах се да реша проблема по следният начин: На всеки ком. направих файл който да тегли данните от централния файл и веднага го затваря. След обработка на данните ги записва в централния файл и го затваря. Но понякога двама едновременно правят трансфер на данни и VBA дава грешка.
Та въпросът ми е може ли да се направи проверка дали някой файл е отворен в момента? И ако е отворен програмата да изчаква с трансфера на данни докато се освободи.
Или ако някой знае как да се направи едновременна работа на 1 файл от няколко компютъра бих бил признателен да сподели.
На отзовалите се предварително благодаря.
Та въпросът ми е може ли да се направи проверка дали някой файл е отворен в момента? И ако е отворен програмата да изчаква с трансфера на данни докато се освободи.
Или ако някой знае как да се направи едновременна работа на 1 файл от няколко компютъра бих бил признателен да сподели.
На отзовалите се предварително благодаря.
Re: excel в мрежа
Това, което е предложил Алексов за share на файла е решението, но аз искам от опит да споделя, че share-ване на файлове не е добра идея.
Винаги възникват грешки, кой какво направил, кога точно го е правил и т.н.
хем на мен ми се е налагало да си споделям файл с макс трима души, пък вие сте осем.
дай малко повече инфо какво точно ще се прави в тези файлове, за да ти дам няколко акъла как да се намалят грешките.
и пак казвам - не е добра идея. Всъщност добра е, но трябва много добър синхрон и комуникация между потребителите
Винаги възникват грешки, кой какво направил, кога точно го е правил и т.н.
хем на мен ми се е налагало да си споделям файл с макс трима души, пък вие сте осем.
дай малко повече инфо какво точно ще се прави в тези файлове, за да ти дам няколко акъла как да се намалят грешките.
и пак казвам - не е добра идея. Всъщност добра е, но трябва много добър синхрон и комуникация между потребителите
Re: excel в мрежа
Ами ще се опитам да обясня най-общо. Обобщава работата в пласмента ни. Значи такааа:
идва поръчка някаква си от даден дистрибутор или от наш магазин (всяко от момичетата в пласмента отговаря за дадена група дистрибутори). Поръчката се записва в таблица(номер(уникален за всяка поръчка - по него се следи изработка, доставка и т.н. той включва и инициал на този който е записал поръчката), тип изделие , вид изделие, цветове, дистрибутор, краен срок, брой). От тая таблица се създават списъци за производство (всеки следващ с различен номер като програмата прави автоматично отделни списъци за различните типове изделия, защото се произвеждат в различни цехове) Пуснатите за производство поръчки се маркират (направил съм го с оцветяване за нагледност). Ако дадена поръчка наближи крайния срок и не е пусната за производство се показва съобщение и се оцветяват буквите и( така желаеха). След това се създава файл, който го пращаме за по-нататъчна обработка с негои не се занимава вече тази програма, защото става сложно и тромаво. На подобен принцип се правят и списъци за товарене( експорт), пак с различни номера и автоматично съобразяване с посоката на курса и пак с различно оцветяване и т.н. Тези два вида списъци се се прявят в няколко екземпляра и с различен брой колони ( само с информация която касае отделния етап ) Отделно се създават стокови разписки за дистрибуторите с цени и стойност. След пристигане на стоката по места чрез потвърждание на доставката. Поръчките се прехвърлят в архив.
В общи линии е това . Та щефа във всеки един момент при натискане на даден бутон получава исканата и сортирана информация.
Мислех програмката да я правя на access , ама много му куца визоализацията, а и не ми е в кръвта.
идва поръчка някаква си от даден дистрибутор или от наш магазин (всяко от момичетата в пласмента отговаря за дадена група дистрибутори). Поръчката се записва в таблица(номер(уникален за всяка поръчка - по него се следи изработка, доставка и т.н. той включва и инициал на този който е записал поръчката), тип изделие , вид изделие, цветове, дистрибутор, краен срок, брой). От тая таблица се създават списъци за производство (всеки следващ с различен номер като програмата прави автоматично отделни списъци за различните типове изделия, защото се произвеждат в различни цехове) Пуснатите за производство поръчки се маркират (направил съм го с оцветяване за нагледност). Ако дадена поръчка наближи крайния срок и не е пусната за производство се показва съобщение и се оцветяват буквите и( така желаеха). След това се създава файл, който го пращаме за по-нататъчна обработка с негои не се занимава вече тази програма, защото става сложно и тромаво. На подобен принцип се правят и списъци за товарене( експорт), пак с различни номера и автоматично съобразяване с посоката на курса и пак с различно оцветяване и т.н. Тези два вида списъци се се прявят в няколко екземпляра и с различен брой колони ( само с информация която касае отделния етап ) Отделно се създават стокови разписки за дистрибуторите с цени и стойност. След пристигане на стоката по места чрез потвърждание на доставката. Поръчките се прехвърлят в архив.
В общи линии е това . Та щефа във всеки един момент при натискане на даден бутон получава исканата и сортирана информация.
Мислех програмката да я правя на access , ама много му куца визоализацията, а и не ми е в кръвта.
Re: excel в мрежа
батенце, как си го сготвил всичко туй в Ексел?
мене ми звучи като някаква фантастика. Еваларка просто
Не разбрах обаче кое точно налага шерването на файла. Искаш всяка девойка да може да въвежда ли?
мене ми звучи като някаква фантастика. Еваларка просто
Не разбрах обаче кое точно налага шерването на файла. Искаш всяка девойка да може да въвежда ли?
Re: excel в мрежа
Не само искам да се въвежда от всички едновременно , но и се налага. Телефоните звънят през минута. Постоянно се дават нови поръчки, искат се справки и корекции. Иначе пускането на списъците в действие става само 3-4 пъти дневно. Но през останалото време всички работят с таблицата едновременно.
Re: excel в мрежа
В отговор на:Телефоните звънят през минута. Постоянно се дават нови поръчки, искат се справки и корекции
При такава ситуация, каквото и да мислиш винаги ще има сериозен риск две от момичетата да работят едновременно, което да доведе до бъгове. Например няколко от тях едновременно да решат да въвеждат в ред 1456 примерно. и после на коя трябва да се запазят данните?
От друга страна на теб зорът ти е да има шефът справката си.
в такъв случай правилното решение според мен е да направиш нещата така, че всеки да си въвежда данните в свой си файл, от които файлове периодично централният файл да "опреснява" данните си. Например вечер в 22.00 часа, когато е сигурно, че никой не работи. Или пък всеки ден в 13.00 и в 18.00 на потребителите да им излиза съобщение да сейфат и да спрат работа за няколко минути.
друго не виждам какво можеш да направиш
Re: excel в мрежа
Оф, шефът ми е най-малкия проблем. Справки се искат от дистрибуторите и произвадството, а и никой едновременно не може да въведе на един и същ ред. Направил съм въвеждането на данните чрез форми и таблицата е заключена. Програмата следи поредния свободен ред.
Така съм направил както казваш - на всеки компютър отделен файл и един централен ползван като база, който се опреснява при промяна на един от другите и обратно. Проблема идва, ако случайно две мацки натиснат бутон за вход и изход на данни. Затуй отначало въпросът ми беше: Може ли да се направи проверка от VBA дали даден файл е отворен.
Така съм направил както казваш - на всеки компютър отделен файл и един централен ползван като база, който се опреснява при промяна на един от другите и обратно. Проблема идва, ако случайно две мацки натиснат бутон за вход и изход на данни. Затуй отначало въпросът ми беше: Може ли да се направи проверка от VBA дали даден файл е отворен.
Re: excel в мрежа
шерването наистина може да доведе до доста проблеми при работата понякога, например пивотките не работят читаво.
Сещам се единствено за варианта всеки да си работи в отделен файл а в друг файл с макрос да се обиденяват данните когато е необходимо, той просто ще обхожда останалите файлове и ще събира информацията от тях.
Go Install Analysis Toolpack!
Сещам се единствено за варианта всеки да си работи в отделен файл а в друг файл с макрос да се обиденяват данните когато е необходимо, той просто ще обхожда останалите файлове и ще събира информацията от тях.
Go Install Analysis Toolpack!
Re: excel в мрежа
Опитай това дали ще ти свърши работа.
В реда преди отварянето на файла постави следното
On Error GoTo errorhandler
....
а в края
Exit Sub
errorhandler:
MsgBox ("Някакво съобщение")
End Sub
По този начин, стигайки до реда, в който се указва да се отвори файла, ако е отворен ще прекъсне изпълнението и ще изведе съобщението.
А ето и една функция, която проверява дали даден файл е отворен
Function bFileOpen(wbName As String) As Boolean
Dim wb As Workbook
'check each open workbook's name, in lower case, and set the function
'to true if a match is found. If not match the function defaults to False
For Each wb In Workbooks
If LCase(wb.Name) = LCase(wbName) Then
bFileOpen = True
Exit Function
End If
Next
End Function
В реда преди отварянето на файла постави следното
On Error GoTo errorhandler
....
а в края
Exit Sub
errorhandler:
MsgBox ("Някакво съобщение")
End Sub
По този начин, стигайки до реда, в който се указва да се отвори файла, ако е отворен ще прекъсне изпълнението и ще изведе съобщението.
А ето и една функция, която проверява дали даден файл е отворен
Function bFileOpen(wbName As String) As Boolean
Dim wb As Workbook
'check each open workbook's name, in lower case, and set the function
'to true if a match is found. If not match the function defaults to False
For Each wb In Workbooks
If LCase(wb.Name) = LCase(wbName) Then
bFileOpen = True
Exit Function
End If
Next
End Function
Re: excel в мрежа
Хубава функция, ама проверява дали аз съм го отворил, а на мене ми трябва проверка дали е отворен от друг.
Това с грешката съм го пробвалкато вариант, обаче аз не искам да прекъсвам процедурата, а програмата да изчака файла да се затвори това става в рамките на не повече от 15 сек.(толкова е времето за трансфера). Пробвал съм с On Error GoTo към по горен ред ама като мине повторно през On Error не знам какво става, ама не го зачита винаги.
И още нещо да попитам. Някой знаели как се извежда динамичен mgbox т.е, да ти се появява съобщение само докато тече някакъв цикъл или нещо друго без да е необходимо да се натиска ОК ?
Това с грешката съм го пробвалкато вариант, обаче аз не искам да прекъсвам процедурата, а програмата да изчака файла да се затвори това става в рамките на не повече от 15 сек.(толкова е времето за трансфера). Пробвал съм с On Error GoTo към по горен ред ама като мине повторно през On Error не знам какво става, ама не го зачита винаги.
И още нещо да попитам. Някой знаели как се извежда динамичен mgbox т.е, да ти се появява съобщение само докато тече някакъв цикъл или нещо друго без да е необходимо да се натиска ОК ?
Редактирано от nepukis на
Re: excel в мрежа
За показване на съобщение, докато тече изпълнението
В началото
Form1.Show
.....
В края
Unload Form1
Пробвай дали това става да го включиш в On Error GoTo ... да изпълни макроса след определено време
Application.OnTime Now + TimeValue("00:00:15"), "MyMacro"
В началото
Form1.Show
.....
В края
Unload Form1
Пробвай дали това става да го включиш в On Error GoTo ... да изпълни макроса след определено време
Application.OnTime Now + TimeValue("00:00:15"), "MyMacro"
Re: excel в мрежа
Даа, идеята ми харесва, но пак трябва след 15 секунди да направя проверка, защото друг може да изпревари с отварянето.
Но с една дума благодаря за съветите на всички. Ще дерзая нататък ще се помъча да стигна до най-приемливо решение.
Но с една дума благодаря за съветите на всички. Ще дерзая нататък ще се помъча да стигна до най-приемливо решение.
Re: excel в мрежа
Ако правилно съм разбрала има един главен файл и няколко други, от които
се отваря главния. Ако в файлове, които отварят главния се направи така
Sub MyMacro ()
....
On Error GoTo errorhandler
' отваряне на файла
.....
Exit Sub
Errorhandler:
Application.OnTime Now + TimeValue("00:00:15"), "MyMacro"
End Sub
по този начин, когато някой се опита да отвори файла и той вече е
отворен ще изчака 15 сек. и ще започне изпълнението отначало. Ако
отново е отворен пак ще изчака и нов опит за отваряне.
се отваря главния. Ако в файлове, които отварят главния се направи така
Sub MyMacro ()
....
On Error GoTo errorhandler
' отваряне на файла
.....
Exit Sub
Errorhandler:
Application.OnTime Now + TimeValue("00:00:15"), "MyMacro"
End Sub
по този начин, когато някой се опита да отвори файла и той вече е
отворен ще изчака 15 сек. и ще започне изпълнението отначало. Ако
отново е отворен пак ще изчака и нов опит за отваряне.
Re: excel в мрежа
Да бе верно, че има логика в това. Но знаеш, че когато дадеш save на файл той може да се запази веднъж за части от секундата друг път му трябва доста повече време.Всеки път времетраенето е различно. Проблема е ако например файла се затвори на 11-стата секунда и друг го отвори на 13-тата. Тогаз какво правим? 
Re: excel в мрежа
Това спроед мен няма значение, защото отмерва времето от възникването
на грешка при опит за отваряне на вече отворения файл. Ако не е отворен
файла от друг продължава с изпълнението, ако е отворен прекъсва за 15 сек. и опитва отново отначало, ако вече не отворен продължава с изпълнението, ако е отворен пак изчаква 15 сек. и т.н.
Сигурно не мога да обясня добре, ако трябва пак ще опитам
пиши какви ги сътвори, че ми е интересно как ще се реши проблема
на грешка при опит за отваряне на вече отворения файл. Ако не е отворен
файла от друг продължава с изпълнението, ако е отворен прекъсва за 15 сек. и опитва отново отначало, ако вече не отворен продължава с изпълнението, ако е отворен пак изчаква 15 сек. и т.н.
Сигурно не мога да обясня добре, ако трябва пак ще опитам
пиши какви ги сътвори, че ми е интересно как ще се реши проблема
Re: excel в мрежа
До колкото разбирам, въпросът ти е как главният файл с информация да не се записва от двама потребители едновременно.
Това, което се сещам е, когато някой отваря файла за запис, да се създава един временен файл, там на сървъра, напр. "lock.tmp". Когато файлът се освободи от този потребител файлът се изтрива. Някой друг, когато отваря главния файл първо проверява дали има създаден "lock.tmp". Ако има изчаква някакъв интервал и пак проверява, докато се освободи.
На този прицип са скриптовете за броене за посетители в интернет сайтовете
Това, което се сещам е, когато някой отваря файла за запис, да се създава един временен файл, там на сървъра, напр. "lock.tmp". Когато файлът се освободи от този потребител файлът се изтрива. Някой друг, когато отваря главния файл първо проверява дали има създаден "lock.tmp". Ако има изчаква някакъв интервал и пак проверява, докато се освободи.
На този прицип са скриптовете за броене за посетители в интернет сайтовете
Re: excel в мрежа
Да, и тая идея е добра, само се безпокоя с този допълнителен файл да не се затрия нейде информация. Но ще пробвам и този метод.
Re: excel в мрежа
По принцип допълнителният файл е празен, и не е нужно да e екселски, може примерно само да се вписва в него от кой се използва екселският файл. Не виждам каква информация може да се загуби?! Ролята му е само като маркер - ако съществува заключващия/допълнителният/ файл, значи, че екселският файл се използва от някой, ако го няма значи и екселският файл е свободен.
Ето примерен код, който съм го писал преди 5 години. Целта му е да дава пореден номер при заявка на отделни потребители:
'Връща пореден номер за файл
Sub MitNumber()
Const ForReading = 1, ForWriting = 2, ForAppending = 3
Const LockFileName = "~LockMit.txt"
Dim fs, fl, fm, m, a, Start
Dim LockFile As Boolean
'Проверка за заключващ файл
Set fl = Application.FileSearch
Do
With fl
.LookIn = LockPath
.SearchSubFolders = False
.Filename = LockFileName
If .Execute > 0 Then
Start = Timer ' Set start time.
Do While Timer < Start + 3
DoEvents ' Yield to other processes.
Loop
LockFile = True
Else
LockFile = False
End If
End With
Loop Until LockFile = False
' Създаване на заключващ файл до приключване на процедурата
Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.CreateTextFile(LockPath & LockFileName, False)
a.Close
SetAttr LockPath & LockFileName, 1 'vbHidden + vbReadOnly + vbSystem
'______________________________________________________
'Четене на текущата стойност в !Mitnum.txt
Set m = fs.GetFile(NumPath & NumFileName)
Set fm = m.OpenAsTextStream(ForReading)
MitNum = fm.readline
fm.Close
MitNum = MitNum + 1 'дава новия номер
'Сравняване с вече съществуващите файлове
CheckMit
'Актуализиране на текущия номер при необходимост
If MitNum <= MitBigest Then
MitNum = MitBigest + 1
End If
'Записване на новата стойност в !Mitnum.txt
Set fm = m.OpenAsTextStream(ForWriting)
fm.Write (MitNum)
fm.Close
'Изтриване на ~LockMit.txt
fs.DeleteFile LockPath & LockFileName, True
End Sub
"~LockMit.txt " е заключващия файл, а "!Mitnum.txt" е в ролята на твоя екселски файл с поръчки.
В твоя случай:
1. Някой иска да записва в екселския файл на сървъра
2. Проверява дали някой го използва в момента:
2.1 Проверката става, като се търси специален файл с дадено име на същия сървър
2.1.1 Ако специалният файл съществува, значи главният екселски файл се използва. Пуска се пауза и след това се пуска нова проверка
2.1.2 Ако специалният файл не е намерен, значи екселският файл е свободен за работа и се преминава на следващ етап
3. Създава се гореспоменатия специален файл, който да предупреждава останалите потребители, че екселският файл е зает
4. Работи се с екселския файл и се затваря след това.
5. Специалният файл се изтрива, което е знак за останалите, че екселският файл е свободен.
Ето примерен код, който съм го писал преди 5 години. Целта му е да дава пореден номер при заявка на отделни потребители:
'Връща пореден номер за файл
Sub MitNumber()
Const ForReading = 1, ForWriting = 2, ForAppending = 3
Const LockFileName = "~LockMit.txt"
Dim fs, fl, fm, m, a, Start
Dim LockFile As Boolean
'Проверка за заключващ файл
Set fl = Application.FileSearch
Do
With fl
.LookIn = LockPath
.SearchSubFolders = False
.Filename = LockFileName
If .Execute > 0 Then
Start = Timer ' Set start time.
Do While Timer < Start + 3
DoEvents ' Yield to other processes.
Loop
LockFile = True
Else
LockFile = False
End If
End With
Loop Until LockFile = False
' Създаване на заключващ файл до приключване на процедурата
Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.CreateTextFile(LockPath & LockFileName, False)
a.Close
SetAttr LockPath & LockFileName, 1 'vbHidden + vbReadOnly + vbSystem
'______________________________________________________
'Четене на текущата стойност в !Mitnum.txt
Set m = fs.GetFile(NumPath & NumFileName)
Set fm = m.OpenAsTextStream(ForReading)
MitNum = fm.readline
fm.Close
MitNum = MitNum + 1 'дава новия номер
'Сравняване с вече съществуващите файлове
CheckMit
'Актуализиране на текущия номер при необходимост
If MitNum <= MitBigest Then
MitNum = MitBigest + 1
End If
'Записване на новата стойност в !Mitnum.txt
Set fm = m.OpenAsTextStream(ForWriting)
fm.Write (MitNum)
fm.Close
'Изтриване на ~LockMit.txt
fs.DeleteFile LockPath & LockFileName, True
End Sub
"~LockMit.txt " е заключващия файл, а "!Mitnum.txt" е в ролята на твоя екселски файл с поръчки.
В твоя случай:
1. Някой иска да записва в екселския файл на сървъра
2. Проверява дали някой го използва в момента:
2.1 Проверката става, като се търси специален файл с дадено име на същия сървър
2.1.1 Ако специалният файл съществува, значи главният екселски файл се използва. Пуска се пауза и след това се пуска нова проверка
2.1.2 Ако специалният файл не е намерен, значи екселският файл е свободен за работа и се преминава на следващ етап
3. Създава се гореспоменатия специален файл, който да предупреждава останалите потребители, че екселският файл е зает
4. Работи се с екселския файл и се затваря след това.
5. Специалният файл се изтрива, което е знак за останалите, че екселският файл е свободен.
Редактирано от FastTaker на
Re: excel в мрежа
Динамичен msgbox не знам, но това е нещо подобно:
oldStatusBar = Application.DisplayStatusBar
Application.DisplayStatusBar = True
Application.StatusBar = "Please be patient..."
Workbooks.Open filename:="LARGE.XLS"
Application.StatusBar = False
Application.DisplayStatusBar = oldStatusBar
Това е от хелпа на ексела
oldStatusBar = Application.DisplayStatusBar
Application.DisplayStatusBar = True
Application.StatusBar = "Please be patient..."
Workbooks.Open filename:="LARGE.XLS"
Application.StatusBar = False
Application.DisplayStatusBar = oldStatusBar
Това е от хелпа на ексела