Avatar billede Slettet bruger
01. oktober 2004 - 15:40 Der er 10 kommentarer og
1 løsning

Åbne filer i Word+macro

Er det muligt at lave et program som overvåger en bestem mappe for om der kommer nye filer, og hvis der gør, så åbner dem i word og udfører en Word Macro på det?
Programmet skal derefter lukke dokumentet ned uden at ændringerne som macroen har foretaget bliver gemt..

Anyone..? :s

- GartZen
Avatar billede bertelbrander Novice
01. oktober 2004 - 23:37 #1
Ikke fordi jeg ved noget om Word og macro'er i samme, men jeg tror at du skal dele opgaven i to:

1: Køre macro'en på et dokument fra en genvej/kommandolinie.
2: Gøre det fra et program.

Jeg tror at de er bedre til at hjælpe med det første i:
http://www.eksperten.dk/spm/Programmer/Officepakker/Microsoft-Office/

Hvis/når du har fået den opgave løst kan vi godt hjælpe med resten.

Alternativet var måske at lave det i Visual-Basic:
http://www.eksperten.dk/spm/Programmering/Visual-Basic/
Avatar billede Slettet bruger
02. oktober 2004 - 18:59 #2
1: Så man kan lave en dirrekte genvej til at køre en macro på et dokument?
Avatar billede bertelbrander Novice
03. oktober 2004 - 00:38 #3
Jeg ved ikke om man kan lave det fra en genvej. Det ved de nok mere om i office gruppen.
Hvis man kan, er resten let at lave i C/C++.

Hvis ikke man kan, tror jeg at det er lettere at lave i Visual Basic.
Avatar billede Slettet bruger
03. oktober 2004 - 15:03 #4
Kan du give et eksempel på hvordan man kan "overvåge" en mappe for om der kommer nye filer?
Avatar billede Slettet bruger
05. oktober 2004 - 13:34 #6
er det muligt at lave lidt om på msdn eksemplet, så det kun overvåger om der kommer nye filer IND i biblioteket? Det skal være ligemeget om der bliver slettet...
Jeg har prøvet at lave det selv, men jeg kan ikke rigtig finde ud af kommandoerne i eksemplet! Er .forholdsvist. newbie i programmering...
Avatar billede bertelbrander Novice
05. oktober 2004 - 20:30 #7
Så vidt jeg ved kan den ikke skelne mellem filer der bliver puttet i mappen, fjernet fra mappen eller omdøbt.

Du bliver nødt til at løbe filerne i mappen igennem for at se om der kommet nye filer i mappen.
Avatar billede Slettet bruger
05. oktober 2004 - 20:35 #8
Ok..
Kan/vil du give et eksempel?
Avatar billede bertelbrander Novice
05. oktober 2004 - 21:05 #9
Der er et eksempel på hvordan man skanner en mappe her:
http://www.eksperten.dk/spm/543756

Du kan så lave den om så du bygger en liste over filer, og checker om der er kommet nye filer i mappen/listen.

Jeg kan godt lave et eksempel senere.
Avatar billede bertelbrander Novice
05. oktober 2004 - 23:36 #10
#include <windows.h>
#include <stdlib.h>
#include <iostream>
#include <map>
#include <string>

std::map<std::string, bool >FileMap;

void RefreshDirectory(const char *aDirName);

void WatchDirectory(const char *aDirName)
{
  RefreshDirectory(aDirName); // First list all files in the dir
  DWORD dwWaitStatus;
  HANDLE ChangeHandle;
  char lpDrive[4];
  char lpFile[_MAX_FNAME];
  char lpExt[_MAX_EXT];

  _splitpath(aDirName, lpDrive, NULL, lpFile, lpExt);

  lpDrive[2] = '\\';
  lpDrive[3] = '\0';

  ChangeHandle = FindFirstChangeNotification(aDirName, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME);

  if(ChangeHandle == INVALID_HANDLE_VALUE)
      ExitProcess(GetLastError());

  while (1)
  {
      dwWaitStatus = WaitForSingleObject(ChangeHandle, INFINITE);

      switch (dwWaitStatus)
      {
      case WAIT_OBJECT_0:
        RefreshDirectory(aDirName);
        if (FindNextChangeNotification(ChangeHandle) == FALSE)
            ExitProcess(GetLastError());
        break;
      default:
        ExitProcess(GetLastError());
      }
  }
}

void RefreshDirectory(const char *aDirName)
{
  std::string SrcPattern = std::string(aDirName) + "*";
  std::map<std::string, bool >::iterator it;

  // First mark all as "not pressent"
  for(it = FileMap.begin(); it != FileMap.end(); ++it)
      it->second = false;

  WIN32_FIND_DATA FindFileData;
  HANDLE hFind = FindFirstFile(SrcPattern.c_str(), &FindFileData);

  if (hFind == INVALID_HANDLE_VALUE)
  {
    std::cerr << "Invalid File Handle. GetLastError reports: " <<  GetLastError() << std::endl;
    return;
  }
  else
  {
      do
      {
        if(!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
        {
            it = FileMap.find(FindFileData.cFileName);
            if(it != FileMap.end())
            {  // The did exist
              it->second = true; // Mark as pressent
            }
            else
            {
              std::cout << "New file: " << FindFileData.cFileName << std::endl;
              FileMap.insert(std::make_pair(std::string(FindFileData.cFileName), true));
            }
        }
      }
      while(FindNextFile(hFind, &FindFileData));
      FindClose(hFind);
  }
  // Find the files which has been removed
  for(it = FileMap.begin(); it != FileMap.end(); )
  {
      if(!it->second)
      {
        std::cout << "The file has been removed: " << it->first << std::endl;
        FileMap.erase(it);
        it = FileMap.begin();
      }
      else
      {
        ++it;
      }
  }
}

int main()
{
  WatchDirectory("D:\\Program\\");
  return 0;
}
Avatar billede Slettet bruger
13. oktober 2004 - 23:48 #11
1.000 tak for det ;)
Jeg havde helt glemt at lukke.. så vidt jeg husker er der noget med at du ikke ønsker point?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester