Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2016, 14:44   #1
mk-de
Новичок
Джуниор
 
Регистрация: 14.05.2016
Сообщений: 1
По умолчанию Добавление данных в активном/открытом режиме

Добрый день.
На этом форуме я новичок, а также с VBA/Макросы в Excel имею не сильно большой опыт работы, так как больше приходится работать с VBScript в WinCC.

Буду очень благодарен, если посоветуете как лучше решить такую задачу:

Есть два компа (Windows 7 64bit), соединены между собой сетевым кабелем (домена нет, оба в workgroup), у первого IP 172.168.0.1 у второго 172.168.0.2. На первом постоянно работает WinCC Runtime и каждые 5 сек сохраняет мне данные (через VBScript) в открытую папку на втором компе в виде *.xlsx файла (в приницпе могу сохранять в любой файл).
Второй комп нужен только для Excel, в котором в таблице 1 с именем "abc" будут в активном режиме (т.е. тогда, когда сам документ открыт, обязательное условие) добавляться каждые 5 сек новые данные из первого файла. В VBScript в WinCC я написал такой код:
Код:

Dim ts, Datum, Uhrzeit

ts = Now
Datum = Right("0" & DatePart("d", ts), 2) & "." & Right("0" & DatePart("m", ts), 2) & "." & Right("0" & DatePart("yyyy", ts), 2)
Uhrzeit = Right("0" & DatePart("h", ts), 2) & ":" & Right("0" & DatePart("n", ts), 2) & ":" & Right("0" & DatePart("s", ts), 2)


Dim datei, file, fso, objexcel, Zeile, ws

datei="\\WS46\EXCEL\Protokoll" & Datum & ".xlsx"
file="Protokoll" & Datum & ".xlsx"

Set fso = CreateObject("Scripting.FileSystemObject")
Set objexcel = CreateObject("Excel.Application")

If Not fso.FileExists (datei) Then		

		objexcel.Workbooks.Add
		Set ws = objexcel.Worksheets.Add
		ws.name = "abc"
		Zeile = objexcel.Range("BZ1") + 1
		objexcel.Cells(1, 1).Value = "Datum"
		objexcel.Cells(1, 2).Value = "Uhrzeit"
		objexcel.Cells(1, 3).Value = "Variable A"
		objexcel.Cells(1, 4).Value = "Variable B"
		
		objexcel.Range("BZ1") = Zeile
		objexcel.ActiveWorkbook.SaveAs(datei)
		objexcel.Quit		
			
End If


Dim  TheCount, objExcelApp, TargetBookrunning, XLSrunning, objWorkbook, wsExcel

TheCount = GetObject("winmgmts:root\CIMV2").ExecQuery("SELECT * FROM Win32_Process WHERE Name='EXCEL.EXE'").Count

	If TheCount > 0 Then
	
		Set objExcelApp = GetObject(,"Excel.Application")
		TargetBookrunning = 0
			
			For Each XLSrunning In objExcelApp.Workbooks
			
				If XLSrunning.name = file Then
		
				TargetBookrunning = 1
			
				End If

			Next
			
		If TargetBookrunning = 1 Then
			
			Set objWorkbook = GetObject(datei)	
			Set wsExcel = objExcelApp.Worksheets("abc")				
			Zeile = wsExcel.Range("BZ1") + 1			
			wsExcel.Cells (Zeile , 1) = Datum
			wsExcel.Cells (Zeile , 2) = Uhrzeit	
			wsExcel.Cells (Zeile , 3) = Variable A
			wsExcel.Cells (Zeile , 4) = Variable B
			
			
			wsExcel.Range("BZ1") = Zeile 			
			objExcelApp.ActiveWorkbook.Save
			
		Else
		
			Set objWorkbook = objExcelApp.Workbooks.Open(datei)	
			Set wsExcel = objExcelApp.Worksheets("abc")			
			Zeile = wsExcel.Range("BZ1") + 1			
			wsExcel.Cells (Zeile , 1) = Datum
			wsExcel.Cells (Zeile , 2) = Uhrzeit	
			wsExcel.Cells (Zeile , 3) = Variable A
			wsExcel.Cells (Zeile , 4) = Variable B
					
			wsExcel.Range("BZ1") = Zeile 			
			objExcelApp.ActiveWorkbook.Save
						
		End If


	Else
	
		Set objExcelApp = CreateObject("Excel.Application")
		Set objWorkbook = objExcelApp.Workbooks.Open(datei)
	
	End If
	


Set ts = Nothing
Set Datum = Nothing
Set Uhrzeit = Nothing

Set datei = Nothing
Set fso = Nothing
Set objexcel = Nothing
Set Zeile = Nothing

Set TheCount = Nothing
Set objExcelApp = Nothing
Set objWorkbook = Nothing
Set TargetBookrunning = Nothing
Set XLSrunning = Nothing
Set wsExcel = Nothing
Если этот xlsx файл сохранять/открывать на первом компе, то все работает как нужно, потому что сам Excel запущен соответственно на первом компе. Если же я открываю этот файл со второго компа, то процесс записи останавливается, так как первый комп не может в этот момент записать новые данные в этот файл.

Идея сделать это через макрос в отдельном файле xlsx, который будет храниться на втором компе и в начале при открытии будет считывать все, что имеется в основном файле xlsx в Таблице abc, а далее по таймеру будет читать данные из основного файла и добавлять одну новую строку в Таблицу abc.

Заранее большое спасибо!

Последний раз редактировалось mk-de; 14.05.2016 в 15:05.
mk-de вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макров не срабатывает на активном листе PreoLo Microsoft Office Excel 6 21.05.2015 08:57
Добавление строки в Memtable в режиме runtime Dozent Общие вопросы Delphi 1 30.09.2013 03:01
Задержка в открытом Word-е valerij Microsoft Office Word 6 11.11.2009 19:49
Поиск в реестре* не активном nivea Помощь студентам 3 14.01.2008 17:42