Propósito

✔ Programação GLOBAL® - Quaisquer soluções e/ou desenvolvimento de aplicações pessoais, ou da empresa, que não constem neste Blog devem ser tratados como consultoria freelance. Queiram contatar-nos: brazilsalesforceeffectiveness@gmail.com | ESTE BLOG NÃO SE RESPONSABILIZA POR QUAISQUER DANOS PROVENIENTES DO USO DOS CÓDIGOS AQUI POSTADOS EM APLICAÇÕES PESSOAIS OU DE TERCEIROS.

BIG DATA - Administrando a sobrecarga de dados corporativos





Ter problemas em administrar uma grande quantidade de dados antigamente restringia-se aos grandes das mídias sociais, tais como Amazon, Google, Yahoo, Facebook... Mas de uns tempos para cá, mais empresas, de todos os setores, têm demonstrado interesse em ganhar vantagem competitiva por explorar o seu BIG DATA na esperança de desenterrar qualquer informação valiosa escondida na sua própria montanha de dados.

Sim, companhias como o  Walmart e a rede de lojas de conveniência Wawa têm grandes planos para BIG DATA, e excelentes cases de onde podemos abstrair algumas ideias.

Alguns estão se aventurando na análise para atender mais rapidamente aos clientes, e acompanhar melhor o histórico de informações desses ou mesmo apresentar novos produtos ao mercado de forma mais rápida.

Qualquer negócio nessa Era da Internet, que você não faça, os seus concorrentes farão
Ashish Nadkarni

Organizações de todos os tamanhos estão sendo inundadas por dados, de fontes tanto internas quanto externas. Grande parte desses dados está sendo transmitida em tempo real – e grande parte dela é tornada obsoleta em poucos minutos, horas ou em alguns dias.

As necessidades de armazenamento resultante são especialmente problemáticas para grandes empresas onde a quantidade de dados estruturados e não estruturados cresceu em média 44% de 2010 a 2011, de acordo com o Aberdeen Group.

Em empresas de todos os tamanhos, as necessidades de armazenamento de dados estão duplicando a cada dois anos e meio. Diferentes ferramentas são necessárias para otimizar o armazenamento de vídeo, planilhas, bancos de dados formatados e dados completamente não estruturados.

As tecnologias que podem ajudar os usuários de BIG DATA incluem a virtualização de armazenamento, a deduplicação e o armazenamento em camadas. 

O armazenamento de bancos de dados relacionais e orientado a objeto são as melhores opções para grandes usuários como cientistas, sites de mídia social e desenvolvedores. Os componentes básicos dos sistemas criados para hospedar petabytes de dados (ou mais) em um formato facilmente acessível são mais complexos do que o funcionamento interno das plataformas de armazenamento mais rotineiras. 

O que segue são alguns conselhos em relação à administração e armazenamento de BIG DATA:

Que tipo de dados você está analisando?
O tipo de armazenamento necessário depende do tipo e da quantidade de dados que analisamos. Todos os dados têm uma vida útil. Uma cotação de ação, por exemplo, só é relevante por um minuto ou dois antes de seu preço mudar. A pontuação de um jogo de baseball é solicitada por cerca de 24 horas, ou até o próximo jogo. Dados deste tipo precisam permanecer no armazenamento primário enquanto sua procura é grande e podem, depois, serem movidos para um armazenamento mais barato. Uma olhada nas tendências ao longo de vários anos reforça a ideia de que dados armazenados por longos períodos normalmente não precisam estar em dispositivos primários facilmente acessíveis.

Que quantidade de armazenamento você realmente precisa?
A quantidade e o tipo de armazenamento que precisamos para o BIG DATA dependem da quantidade de dados que precisamos armazenar e do tempo que esses dados serão úteis.

Podem ser dados de transmissão de várias fontes que são enviados a você literalmente a cada segundo, sobre os quais só dispõe de alguns minutos antes que esses dados tornem-se velhos. Este tipo de dado inclui atualizações sobre o clima, tráfego, assuntos mais falados em redes sociais e tweets sobre eventos ao redor do mundo.

Também pode incluir dados em repouso ou dados gerados e controlados pelo negócio para utilização moderada. Transmitir dados exige apenas capacidades de captura e análise de alto desempenho. Uma vez que fez sua análise, não precisa mais deles.

No caso de dados em repouso ou para dados controlados pelos negócios, cabe a você armazená-los.

Que tipo de ferramenta de armazenamento funciona melhor?
Para empresas que estão apenas começando a luta com a análise e o armazenamento de BIG DATA  os observadores da indústria defendem a virtualização do armazenamento para acomodar todo o armazenamento em um só lugar, a deduplicação para comprimir os dados e uma abordagem de armazenamento em camadas para garantir que os dados mais valiosos sejam mantidos nos sistemas de forma mais facilmente acessíveis. 

A virtualização do armazenamento oferece uma camada de abstração de software que tira os dispositivos físicos da vista do usuário e permite que todos os dispositivos sejam administrados como um único agrupamento. Embora a virtualização de servidores seja um componente bem estabelecido das infraestruturas de TI hoje em dia, a virtualização do armazenamento ainda precisa chegar a tal nível.

Em pesquisa realizada em fevereiro de 2012 pelo Aberdeen Group, com participação de 106 grandes empresas, apenas 20% dos entrevistados disseram possuir um aplicativo único para gestão de armazenamento. A média era de três aplicativos de gestão para 3,2 dispositivos de armazenamento.

Muitos fornecedores de armazenamento relutam em deixar que seus dispositivos sejam administrados pelo produto de outro fornecedor. A virtualização de armazenamento é muito mais complexa e mais demorada, por isso ela ainda não deslanchou como a virtualização de servidores. Em vez disso, muitos administradores de armazenamento estão voltando-se para implementações do tipo em nuvem para armazenamento de terceira ou quarta camada para movimentar dados mais facilmente por diferentes infraestruturas e reduzir os custos com armazenamento. Algumas empresas já fizeram isso e obtiveram bons resultados, mas não é algo garantido.

Esperamos ver um aumento no uso de armazenamento baseado em nuvem e em outros recursos computacionais baseados em nuvem no futuro próximo à medida que a conectividade de rede melhora, os custos caem e a habilidade de codificar e decodificar dados em tempo real melhore. Com a nuvem recebemos uma conta mensal que é paga a partir do orçamento operacional, e não um orçamento separado.

Deduplicação e compressão
Administradores podem diminuir a quantidade de armazenamento necessário por meio da utilização da deduplicação, que elimina dados redundantes através da utilização de ferramentas de compressão que identificam "strings" curtos e repetidos em arquivos individuais e armazenam somente uma cópia de cada.

Até que ponto as necessidades de armazenamento podem ser reduzidas? Na pesquisa do Aberdeen Group, 13% dos entrevistados contaram que reduziram os dados em até 50%, mas um índice mais provável para grande parte das empresas seria uma redução de 30% a 50% dos dados estruturados altamente repetitivos.

Armazenamento em camadas
Depois que o negócio decide o tipo de dado que quer analisar, os administradores de armazenamento podem colocar os dados mais novos e mais importantes em meios de armazenamento mais confiáveis e rápidos. À medida que os dados vão ficando obsoletos, podem ser movidos para um armazenamento mais lento e barato. Sistemas que automatizam o processo de armazenamento em camadas estão ganhando espaço, mas ainda não são amplamente utilizados.

Ao desenvolver níveis de armazenamento, os administradores devem considerar a tecnologia de armazenamento usada, a velocidade do dispositivo e a forma de RAID necessária para proteger os dados.

A resposta padrão para o "failover" é a replicação, normalmente na forma de matrizes RAID. Mas em grandes escalas, o RAID pode criar mais problemas do que soluções, conta Neil Day, vice-presidente e CTO da Shutterfly, um site de fotos online que permite que usuários armazenem um número ilimitado de imagens em sua resolução original. Seu armazenamento excede os 30 petabytes de dados.

No esquema tradicional de armazenamento de dados em RAID, cópias de cada dado são espelhadas e armazenadas nos vários discos que compõem a matriz, garantindo sua integridade e disponibilidade. Mas isso significa que um único dado armazenado e espelhado (copiado) pode aumentar cinco vezes de tamanho, exigindo mais espaço para armazenamento. À medida que o espaço nos discos utilizados nas matrizes de RAID aumenta – discos de 3 terabytes são muito atraentes do ponto de vista de densidade e consumo de energia – o tempo gasto para recolocar o substituto de um disco avariado em paridade plena está cada vez maior.

A Shutterfly eventualmente adotou uma tecnologia de código de exclusão, onde dados podem ser divididos em pedaços, com cada pedaço sendo inútil se estiver só, e dispersados em diferentes discos ou servidores. Os dados podem ser completamente remontados a qualquer momento com uma fração dos pedaços, mesmo se vários pedaços tiverem sido perdidos devido a falhas de dispositivo. Em outras palavras, você não precisa criar várias cópias de dados; uma única instância pode garantir a integridade e a disponibilidade dos dados. Como os códigos de exclusão são baseados em software, a tecnologia pode ser utilizada com o hardware em commodity, diminuindo ainda mais o custo de escala.

Um dos primeiros fornecedores de software baseado em código de exclusão é a Cleversafe, que acrescentou informações de localização para criar o que ela chama de código de dispersão, permitindo que usuários armazenem pedaços de dados – ou fatias, como eles os denominam – em lugares geograficamente separados, como centros de dados múltiplos.

Megausuários de Big Data
Assim como a Shutterfly, empresas com grandes necessidades na área de armazenamento devem olhar além do armazenamento em blocos. Quando falamos sobre imensos conjuntos de dados, na casa dos petabytes, precisamos buscar os armazenamentos baseados em objeto ou um sistema de arquivos distribuídos. Pense sobre ofertas comercialmente disponíveis como o armazenamento de expansão Isilon, da EMC, ou o Fluid File System, da Dell... e nas soluções de código aberto, também. Elas são muito mais baratas para armazenar dados e, de um ponto de vista de desempenho, podem lhe oferecer uma relação preço/desempenho muito melhor. E, por último, elas são escaláveis.

Usuários de softwares comerciais muitas vezes têm dados que são parcialmente descartáveis ou requerem muito pouco pós-processamento.

Menos administradores necessários
Quando implantados corretamente, a virtualização de armazenamento, a deduplicação, o armazenamento em camadas e as tecnologias de código de exclusão devem reduzir sua necessidade de administradores, pois as ferramentas possibilitam a gestão de dados através de uma única tela. No caso da Shutterfly, a infraestrutura de armazenamento automático permitiu que a empresa diminuísse o crescimento de sua equipe de manutenção. À medida que a carga diária de trabalho de manutenção da empresa diminui, os administradores podem passar mais tempo em projetos proativos.

Em alguns casos, projetos de BIG DATA são realizados por equipes especiais, e não por funcionários de TI tradicionais. São operados por, e de propriedade de, unidades de negócio, pois a infraestrutura de TI não é ágil o suficiente para suportar ambientes de BIG DATA  ou ela pode não ter o conjunto de habilidades necessário para isso.

Você pode vir a ter uma situação na qual os administradores de armazenamento não estejam envolvidos. Ou eles podem apenas ter um pequeno papel onde forneçam armazenamento e o resto seja feito pelo grupo dos sistemas.

Em breve
Uma tendência que fará sucesso é o conceito de mover a camada de cálculo para os dados. Olhamos para as soluções da Cleversafe e para as soluções de outros fornecedores de armazenamento que estão desenvolvendo capacidades de cálculo na camada de armazenamento. Não é mais viável mover dados para onde a camada de cálculo fica. É praticamente impossível, especialmente se você tem apenas alguns minutos para analisar os dados antes deles tornarem-se banais. Então, por que eu não deixo a camada de cálculo ficar onde os dados ficam?.

A Cleversafe oferece uma solução de alto desempenho baseada no Hadoop para grandes usuários de BIG DATA como a Shutterfly, mas eles estão tentando torná-la mais abrangente.

A Cleversafe quebra o modelo de aquisição de poder computacional de um fornecedor e de armazenamento de aplicativos de outro fornecedor. Para serem bem-sucedidas junto às grandes empresas as unidades de negócio terão de começar a pensar de forma diferente. Estou confiante de que essa solução logo deslanchará, pois as eficiências no modelo atual simplesmente não são favoráveis para o BIG DATA.

BIG DATA é uma forma das pessoas manterem sua vantagem competitiva. A fim de tirar o máximo proveito de seus dados, elas terão de modificar processos e a forma como funcionam como empresa – elas terão de ser muito ágeis para derivar valor desses dados.

Mas antes de mergulhar em uma nova infraestrutura de armazenamento de BIG DATA as pessoas precisam fazer seu dever de casa. Pesquisar e falar com pessoas que já passaram por isso. Não é como se fosse uma tecnologia de ponta que ninguém utilizou, portanto, converse com alguém que já a utilizou para não cometer os mesmos erros que eles cometeram.

O Hadoop não é mais a única opção
O conceito de BIG DATA cresceu. O termo já foi aplicável a dados complexos que precisavam ser disponibilizados instantaneamente para consultas altamente repetitivas de usuários frequentes como cientistas e sites de mídia social. Hoje ele inclui a profusão de petabytes de dados estruturados e não estruturados que a maioria das empresas deve armazenar.

Embora os sistemas de código livre Hadoop e Cassandra, dizem alguns, sejam as melhores opções para BIG DATA para os trituradores de dados mais vorazes, alguns fornecedores comerciais estão melhorando seus sistemas de armazenamento para lidar com múltiplos petabytes de dados e oferecer formas rápidas e simples de analisá-los.

BIG DATA costumava ser uma ferramenta que apenas as maiores empresas eram capazes de utilizar, mas agora é difícil encontrar alguém que não esteja utilizando algo para obter conhecimento a partir dos dados. Para fazer isso "é melhor você ter um armazenamento eficiente, ou o custo pode lhe trazer prejuízos. Também precisaremos extrair um desempenho decente desses aplicativos, que são muito dinâmicos. E é melhor podermos fazer o backup disso.


Deixe os seus comentários! Envie este artigo, divulgue este link na sua rede social...


Tags: BIG DATA, deduplicação, armazenamento, administrando, sobrecarga, dados, 


VBA Excel - Manipule Ícones nas suas Planilhas - Add Icon Sets for Ranges

Este exemplo mostra como adicionar ícones num determinado intervalo de valores no workbook.

Se você se perguntar prá que precisar saber isso, não está pronto para aprendê-lo...


Sub TestAddIconSet() 
  Dim i As Integer 
  Dim rng As Range 

  For i = 1 To 20 
    ' Set up ranges 
    Set rng = SetupRange(i) 
    Select Case i 
      Case 1 
        SetUpIconSet rng, xl3Arrows 
      Case 2 
        SetUpIconSet rng, xl3ArrowsGray 
      Case 3 
        SetUpIconSet rng, xl3Flags 
      Case 4 
        SetUpIconSet rng, xl3Signs 
      Case 5 
        SetUpIconSet rng, xl3Stars 
      Case 6 
        SetUpIconSet rng, xl3Symbols 
      Case 7 
        SetUpIconSet rng, xl3Symbols2 
      Case 8 
        SetUpIconSet rng, xl3TrafficLights1 
      Case 9 
        SetUpIconSet rng, xl3TrafficLights2 
      Case 10 
        SetUpIconSet rng, xl3Triangles 
      Case 11 
        SetUpIconSet rng, xl4Arrows 
      Case 12 
        ' Reverse the order on this one: 
        SetUpIconSet rng, xl4ArrowsGray, True 
      Case 13 
        SetUpIconSet rng, xl4CRV 
      Case 14 
        SetUpIconSet rng, xl4RedToBlack 
      Case 15 
        SetUpIconSet rng, xl4TrafficLights 
      Case 16 
        SetUpIconSet rng, xl5Arrows 
      Case 17 
        ' Reverse the order on this one: 
        SetUpIconSet rng, xl5ArrowsGray, True 
      Case 18 
        SetUpIconSet rng, xl5Boxes 
      Case 19 
        SetUpIconSet rng, xl5CRV 
      Case 20 
        SetUpIconSet rng, xl5Quarters 
    End Select 
  Next i 
End Sub 
Function SetupRange(col As Integer) As Range 
    ' Set up ranges, filled with numbers from 1 to 10. 
    Set rng = Range(Cells(1, col), Cells(10, col)) 
    
    Dim rng1 As Range 
    Set rng1 = Cells(1, col) 
    rng1.Value = 1 
    Dim rng2 As Range 
    Set rng2 = Cells(2, col) 
    rng2.Value = 2 
    
    Range(rng1, rng2).AutoFill Destination:=rng 
    Set SetupRange = rng 
End Function 
Sub SetUpIconSet(rng As Range, iconSet As XlIconSet, Optional ReverseOrder As Boolean = False) 
    ' Set up an icon set for the supplied range. 
    rng.FormatConditions.Delete 
    Dim isc As IconSetCondition 
    Set isc = rng.FormatConditions.AddIconSetCondition 
    With isc 
        ' If specified, show the icons in the reverse ordering: 
        .ReverseOrder = ReverseOrder 
        .ShowIconOnly = False 
        ' Select the requested icon set: 
        .iconSet = ActiveWorkbook.IconSets(iconSet) 
    End With 
End Sub 


Deixe os seus comentários! Envie este artigo, divulgue este link na sua rede social...



TagsVBA, Excel, Icon, ícones, Conditional, Formatting, 




VBA Excel - Trabalhando com Arquivo e Pasta temporários - Working With Temporary Files And Folders


Estou disponibilizando estes módulos que contém três procedimentos relacionados com arquivos e pastas temporárias.

O primeiro procedimento, GetTempFolderName, retorna o nome da pasta que está configurada para arquivos temporários no usuário atual. Ela retorna o nome da pasta que o sistema tenha especificado para o usuário atual para armazenar os arquivos temporários. 

O segundo procedimento, GetTemporaryFolderName, é usado para obter o nome de uma pasta temporária e, opcionalmente, criá-la. Esta pasta será criada na pasta do usuário do sistema, temp, retornado pela função GetTempFolderName.

O terceiro processo, GetTempFile, é usado para obter o nome do arquivo que está garantido para ser exclusivo dentro da pasta na qual ele for criado.

A documentação de cada procedimento está incluído no próprio código .

Para que estes funcionem, usem a função GetSystemErrorMessageText, disponível aqui; e a função TrimToNull também disponível aqui.


Public Function TrimToNull (S As String) As String
''''''''''''''''''''''''''''''''''''''''''''''''''''

' TrimToNull
' This returns the portion of the string S that
' is to the left of the first vbNullChar character.
' If vbNullChar is not found, the entire string is
' returned.
''''''''''''''''''''''''''''''''''''''''''''''''''''
    Dim Pos As Integer
    Pos = InStr(1, S, vbNullChar)
    If Pos > 0 Then
        TrimToNull = Left(S, Pos - 1)
    Else
        TrimToNull = S
    End If
End Function
Option Explicit
Option Compare Text

'''''''''''''''''''''''''''''''''''
' Maximum Length Of Full File Name
'''''''''''''''''''''''''''''''''''
Private Const MAX_PATH = 260 ' Windows Standard, from VC++ StdLib.h

Private Declare Function GetTempFileName Lib "kernel32" Alias "GetTempFileNameA" ( _
    ByVal lpszPath As String, _
    ByVal lpPrefixString As String, _
    ByVal wUnique As Long, _
    ByVal lpTempFileName As String) As Long
    
Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" ( _
    ByVal nBufferLength As Long, _
    ByVal lpBuffer As String) As Long

Private Declare Function PathGetCharType Lib "shlwapi.dll" _
    Alias "PathGetCharTypeA" ( _
    ByVal ch As Byte) As Long

GetTempFolderName

Public Function GetTempFolderName( _
    Optional IncludeTrailingSlash As Boolean = False) As String
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' GetTempFolder
' This procedure returns the name of the folder that the system has designated
' for temporary files for the current user. 
' Returns the name of the folder or vbNullString if an error 
' occurred. The argument IncludeTrailingSlash indicates whether to include a 
' trailing slash at the end of the folder name.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Dim TempPath As String
Dim Length As Long
Dim Result As Long
Dim ErrorNumber As Long
Dim ErrorText As String

''''''''''''''''''''''''''''''''''''''
' Initialize the variables
''''''''''''''''''''''''''''''''''''''
TempPath = String(MAX_PATH, " ")
Length = MAX_PATH

'''''''''''''''''''''''''''''''''''''''''''''''''
' Get the Temporary Path using GetTempPath.
'''''''''''''''''''''''''''''''''''''''''''''''''
Result = GetTempPath(Length, TempPath)
If Result = 0 Then
    '''''''''''''''''''''''''''''''''''''
    ' An error occurred
    '''''''''''''''''''''''''''''''''''''
    ErrorNumber = Err.LastDllError
    ErrorText = GetSystemErrorMessageText(ErrorNumber)
    MsgBox "An error occurred getting the temporary folder" & _
        " from the GetTempFolderName function: " & vbCrLf & _
        "Error: " & CStr(ErrorNumber) & "  " & ErrorText
    GetTempFolderName = vbNullString
    Exit Function
Else
    '''''''''''''''''''''''''''''''''''''''
    ' No error, but the buffer may have
    ' been too small.
    '''''''''''''''''''''''''''''''''''''''
    If Result > Length Then
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        ' The buffer TempPath was too small to hold the folder name.
        ' This should never happen if MAX_PATH is set to the proper
        ' value.
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        MsgBox "The TempPath buffer is too small. It is allocated at " & _
            CStr(Length) & " characters." & vbCrLf & _
            "The required buffer size is: " & CStr(Result) & " characteres.", _
            vbOKOnly, "GetTempFolderName"
        GetTempFolderName = vbNullString
        Exit Function
    End If

    ' trim up the TempPath. It includes a trailing "\"
    TempPath = TrimToNull(Text:=TempPath)
    
    If IncludeTrailingSlash = False Then
        '''''''''''''''''''''''''''''''''''''''''''''''''
        ' If IncludeTrailingSlash is false, get rid of
        ' the trailing slash.
        '''''''''''''''''''''''''''''''''''''''''''''''''
        TempPath = Left(TempPath, Len(TempPath) - 1)
    End If
End If

GetTempFolderName = TempPath

End Function

GetTemporaryFolderName

Public Function GetTemporaryFolderName(Optional Create As Boolean = False) As String
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' GetTemporaryFolderName
' This function returns the name of a temporary folder name. The folder will be
' in the user's designated temp folder. If Create is True, the folder will
' be created.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Dim FName As String
Dim FileName As String
Dim TempFolderName As String
Dim Pos As Integer

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Get a temp file name with no extension, located in the
' user's system-specified temporary folder.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
FName = GetTempFile(vbNullString, vbNullString, " ", False)
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Find the location of the last "\" character.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Pos = InStrRev(FName, "\", -1, vbTextCompare)
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Get the filename (without the path) of the temp file.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
FileName = Mid(FName, Pos + 1)
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Get the user's system-specified temp folder name
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
TempFolderName = GetTempFolderName(IncludeTrailingSlash:=True)
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' append FolderName to the full folder fname
TempFolderName = TempFolderName & FileName


''''''''''''''''''''''''''''''''''''''''
' Create the folder is requested.
''''''''''''''''''''''''''''''''''''''''
If Create = True Then
    On Error Resume Next
    Err.Clear
    MkDir TempFolderName
    If Err.Number <> 0 Then
        MsgBox "An error occurred creating folder '" & TempFolderName & _ 
              "'" & vbCrLf & _
              "Err: " & CStr(Err.Number) & vbCrLf & _
              "Description: " & Err.Description
        GetTemporaryFolderName = vbNullString
        Exit Function
    End If
End If

''''''''''''''''''''''''''''''''''''''''
' return the result
''''''''''''''''''''''''''''''''''''''''
GetTemporaryFolderName = TempFolderName

End Function

GetTempFile

Public Function GetTempFile (Optional InFolder As String = vbNullString, _
                            Optional FileNamePrefix As String = vbNullString, _
                            Optional Extension As String = vbNullString, _
                            Optional CreateFile As Boolean = True)
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' GetTempFileName
' This function will return the name of a temporary file, optionally suffixed with the
' string in the Extension variable. It will optionally create the file.
'
' If InFolder specifies an existing folder, the file will be created in that folder.
' If InFolder specifies a non-existant folder, the procedure will attempt to create
' the folder.
' If InFolder is vbNullString, the procedure will call GetTempFolderName to get
' the folder designated for temporary files.
' InFolder must be a fully qualified path. That is, a folder name begining with a
' network prefix "\\" or containing ":".

' If FileNamePrefix is specified, the file name will begin with the first three
' characters of this string. In this case, FileNamePrefix must be three characters
' with no spaces or illegal file name characters. These are validated with
' PathGetCharType. If FileNamePrefix is vbNullString, the value of C_DEFAULT_PREFIX
' will be used.
' If FileNamePrefix contains spaces or invalid characters, an error occurs.
'
' If Extension is specified, the filename will have that Extension. If must be three
' valid characters (no spaces). The characters are validated with PathGetCharType.
' If Extension is vbNullString the default extension from GetTempFileName ("tmp") is
' used. Do NOT put the period in front of the extension (e.g., use "xls" not ".xls").
' If Extension is a single space, the file name will have no extension.
'
' If CreateFile is omitted or True, the file will be created. If CreateFile is false,
' the file is not created. (Actually, it will be created by GetTempFileName  and then
' KILLed.)
'
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''


Dim PathBuffer As String
Dim Prefix As String
Dim FolderPath As String
Dim Res As Long
Dim FileName As String
Dim ErrorNumber As Long
Dim ErrorText As String
Dim FileNumber As Integer


Const C_DEFAULT_PREFIX = "TMP"
FileName = String$(MAX_PATH, vbNullChar)


If InFolder = vbNullString Then
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' InFolder was an empty string. Call GetTempFolderName
    ' to get a temporary folder name.
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    PathBuffer = GetTempFolderName(IncludeTrailingSlash:=True)
Else
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' test to see if we have an absolute path
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    If (Left(InFolder, 2) = "\\") Or _
        (InStr(1, InFolder, ":", vbTextCompare) > 0) Then
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        ' We have an absolute path. Test whether the folder exists.
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        If Dir(InFolder, vbHidden + vbSystem + vbHidden + _
                         vbNormal + vbDirectory) = vbNullString Then
            '''''''''''''''''''''''''''''''''''''''''''''''''''
            ' InFolder does not exist. Try to create it.
            '''''''''''''''''''''''''''''''''''''''''''''''''''
            On Error Resume Next
            Err.Clear
            MkDir InFolder
            If Err.Number <> 0 Then
                MsgBox "An error occurred creating the '" & InFolder _
                    & "' folder." & vbCrLf & _
                    "Error: " & CStr(Err.Number) & vbCrLf & _
                    "Description: " & Err.Description, vbOKOnly, "GetTempFileName"
                GetTempFile = vbNullString
                Exit Function
            Else
                '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
                ' MkDir succussfully created the folder. Set PathBuffer to the new
                ' folder name.
                '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
                PathBuffer = InFolder
            End If
        Else
            '''''''''''''''''''''''''''''''''''''''''''''''''''
            ' InFolder exists. Set the PathBuffer variable to InFolder
            '''''''''''''''''''''''''''''''''''''''''''''''''''
            PathBuffer = InFolder
        End If
    Else
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        ' We don't have a fully qualified path. Get out with an error message.
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        MsgBox "The InFolder parameter to GetTempFile is not an absolute file name.", _
                vbOKOnly, "GetTempFileName"
        GetTempFile = vbNullString
        Exit Function
    End If ' LEFT
End If ' InFolder = vbNullString

''''''''''''''''''''''''''''''''''''''''''
' Ensure we have a '\' at the end of the
' path.
'''''''''''''''''''''''''''''''''''''''''
If Right(PathBuffer, 1) <> "\" Then
    PathBuffer = PathBuffer & "\"
End If

If FileNamePrefix = vbNullString Then
    '''''''''''''''''''''''''''''''''''''''''
    ' FileNamePrefix is empty, use 'tmp'
    '''''''''''''''''''''''''''''''''''''''''
    Prefix = C_DEFAULT_PREFIX
Else
    If IsValidFileNamePrefixOrExtension(Spec:=FileNamePrefix) = False Then
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        ' FileNamePrefix is invalid. Get out with an error.
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        MsgBox "The file name prefix '" & FileNamePrefix & "' is invalid.", _
                            vbOKOnly, "GetTempFileName"
        GetTempFile = vbNullString
        Exit Function
    Else
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        ' FileNamePrefix is valid.
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        Prefix = FileNamePrefix
    End If
End If

''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Get the temp file name. GetTempFileName will automatically
' create the file. If CreateFile is False, we'll have
' to Kill the file. We set wUnique to 0 to ensure that
' the filename will be unique. This has the side effect
' of creating the file.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Res = GetTempFileName(lpszPath:=PathBuffer, _
                      lpPrefixString:=Prefix, _
                      wUnique:=0, _
                      lpTempFileName:=FileName)
                        
If Res = 0 Then
    ''''''''''''''''''''''''''''
    ' An error occurred. Get out
    ' with an error message.
    ''''''''''''''''''''''''''''
    ErrorNumber = Err.LastDllError
    ErrorText = GetSystemErrorMessageText(ErrorNumber)
    MsgBox "An error occurred with GetTempFileName" & vbCrLf & _
        "Error: " & CStr(ErrorNumber) & vbCrLf & _
        "Description: " & ErrorText, vbOKOnly, "GetTempFileName"
    GetTempFile = vbNullString
    Exit Function
End If

''''''''''''''''''''''''''''''''''''''''''
' GetTempFileName put the file name in the
' FileName variable, ending with a vbNullChar.
' Trim to the the vbNullChar.
'''''''''''''''''''''''''''''''''''''''''''
FileName = TrimToNull(Text:=FileName)



'''''''''''''''''''''''''''''''''''''''''''
' GetTempFileName created a file with an
' extension of "tmp". If Extension was
' specified and is not a null string,
' change the extension to the specified
' extension. We'll use the same validation
' routine as we did for the prefix.
'''''''''''''''''''''''''''''''''''''''''''
If Extension = vbNullString Then
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' If  Extension is vbNullString, use the extension
    ' created by GetTEmpFileName ("tmp"). Test whether
    ' CreateFile is False. If False, we have to kill the
    ' newly created file.
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''
    If CreateFile = False Then
        On Error Resume Next
        Kill FileName
    Else
        ''''''''''''''''''''''''''''''''''
        ' CreateFile was true. Leave
        ' the newly created file in place
        ''''''''''''''''''''''''''''''''''
    End If
Else ' Extension is not vbNullString
    If Extension = " " Then
        ''''''''''''''''''''''''''''''''''''
        ' An Extension value of " " indicates
        ' that the filename should have no
        ' extension. First Kill FileName, modify
        ' the variable to have no extension, and then
        ' see if we need to create the file. If CreateFile
        ' if False, don't create the file. If True,
        ' create the file by openning it and then
        ' immmediately close it.
        ''''''''''''''''''''''''''''''''''''
        On Error Resume Next
        Kill FileName
        On Error GoTo 0
        FileName = Left(FileName, Len(FileName) - 4)
        If CreateFile = True Then
            ''''''''''''''''''''''''''''''''''''''''
            ' Create the file by opening it for
            ' output, then immediately closing it.
            ''''''''''''''''''''''''''''''''''''''''
            FileNumber = FreeFile
            Open FileName For Output Access Write As #FileNumber
            Close #FileNumber
        Else
            '''''''''''''''''''''''''''''''''''''''''
            ' CreateFile was false. Since we've already
            ' Killed the file created by GetTempFileName,
            ' do nothing.
            ''''''''''''''''''''''''''''''''''''''''''
        End If
        
            
    Else
        
        If IsValidFileNamePrefixOrExtension(Spec:=Extension) Then
            ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            ' If we have a valid extension, kill the existing filename
            ' and the recreate the file with the new extension.
            ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            On Error Resume Next
            Kill FileName
            On Error GoTo 0
            FileName = Left(FileName, Len(FileName) - 4) & "." & Extension
            If CreateFile = True Then
                FileNumber = FreeFile
                Open FileName For Output Access Write As #FileNumber
                Close #FileNumber
            Else
                ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
                ' CreateFile was false. Since we've already killed the
                ' filename created by GetTempFileName, do nothing.
                ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            End If
        Else
            ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            ' The extension was not valid. Display an error and get out.
            ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            MsgBox "The extension '" & Extension & "' is  not valid.", _
                vbOKOnly, "GetTempFileName"
            GetTempFile = vbNullString
            Exit Function
        End If
        
    End If
End If

''''''''''''''''''''''''''''''''''''''''''''
' We were successful. Return the filename.
''''''''''''''''''''''''''''''''''''''''''''
GetTempFile = FileName


End Function

Private Function IsValidFileNamePrefixOrExtension(Spec As String) As Boolean
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' IsValidFileNamePrefix
' This returns TRUE if Prefix is a valid 3 character filename
' prefix used with GetTempFileName
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Const GCT_INVALID As Long = &H0
Const GCT_SEPARATOR As Long = &H8
Const GCT_WILD As Long = &H4
Const GCT_LFNCHAR As Long = &H1
Const GCT_SHORTCHAR As Long = &H2

Dim Ndx As Long
Dim B As Byte
'''''''''''''''''''''''''''''''''
' prefix contains a space. error.
'''''''''''''''''''''''''''''''''
If InStr(1, Spec, " ") > 0 Then
    IsValidFileNamePrefixOrExtension = False
    Exit Function
End If


'''''''''''''''''''''''''''''''''
' prefix is not 3 chars. error.
'''''''''''''''''''''''''''''''''
If Len(Spec) <> 3 Then
    IsValidFileNamePrefixOrExtension = False
    Exit Function
End If

'''''''''''''''''''''''''''''''''
' Loop through the 3 characters
' of Prefix. If we find an
' invalid character, get out with
' a result of False.
'''''''''''''''''''''''''''''''''
For Ndx = 1 To 3
    B = CByte(Asc(Mid(Spec, Ndx, 1)))
    Select Case PathGetCharType(B)
        Case GCT_INVALID, GCT_SEPARATOR, GCT_WILD
            IsValidFileNamePrefixOrExtension = False
            Exit Function
        Case GCT_LFNCHAR, GCT_SHORTCHAR, GCT_LFNCHAR + GCT_SHORTCHAR
        Case Else
            IsValidFileNamePrefixOrExtension = False
            Exit Function
    End Select
Next Ndx

'''''''''''''''''''''''''''''''''
' If we made it out of the loop,
' the Prefix was valid. Return
' True.
'''''''''''''''''''''''''''''''''
IsValidFileNamePrefixOrExtension = True
    
End Function

Public Function TrimToNull(S As String) As String
''''''''''''''''''''''''''''''''''''''''''''''''''''
' TrimToNull
' This returns the portion of the string S that
' is to the left of the first vbNullChar character.
' If vbNullChar is not found, the entire string is
' returned.
''''''''''''''''''''''''''''''''''''''''''''''''''''
    Dim Pos As Integer
    Pos = InStr(1, S, vbNullChar)
    If Pos > 0 Then
        TrimToNull = Left(S, Pos - 1)
    Else
        TrimToNull = S
    End If
End Function

Tags: VBA, excel, Working, Temporary, Files, Folders

ReferenceCPerson

VBA Excel - Enviando e-mail pelo Excel - Sending EMail With VBA



Sim, confesso ter escrito inúmeras vezes sob este tópico e, se continuo fazendo isso, é porque observo uma procura constante pela utilização deste recurso tão simples,mas tão necessário.

Se tudo o que deseja fazer é enviar a planilha, pode usar ThisWorkbook.SendMail. No entanto, se deseja incluir um texto no corpo da mensagem ou incluir arquivos adicionais como anexos, precisará de algum código VBA.

Procurei disponibilizar a função SendEmail por ser bem amigável.

Esse código prescinde da referência ao Microsoft CDO for Windows 2000 Library. Normalmente o localizamos em C:\Windows\system32\cdosys.dll. O GUID para este componente é {CD000000-8B95-11D1-82DB-00C04FB1625D}, para Maior = 1 e Menor = 0.

Function SendEMail (Subject As String, _
        FromAddress As String, _
        ToAddress As String, _
        MailBody As String, _
        SMTP_Server As String, _
        BodyFileName As String, _
        Optional Attachments As Variant = Empty) As Boolean
Dim MailMessage As CDO.Message
Dim N As Long
Dim FNum As Integer
Dim S As String
Dim Body As String
Dim Recips() As String
Dim Recip As String
Dim NRecip As Long

' ensure required parameters are present and valid.
If Len(Trim(Subject)) = 0 Then
    SendEMail = False
    Exit Function
End If

If Len(Trim(FromAddress)) = 0 Then
    SendEMail = False
    Exit Function
End If

If Len(Trim(SMTP_Server)) = 0 Then
    SendEMail = False
    Exit Function
End If

' Clean up the addresses
Recip = Replace(ToAddress, Space(1), vbNullString)
If Right(Recip, 1) = ";" Then
    Recip = Left(Recip, Len(Recip) - 1)
End If
Recips = Split(Recip, ";")

For NRecip = LBound(Recips) To UBound(Recips)
    On Error Resume Next
    ' Create a CDO Message object.
    Set MailMessage = CreateObject("CDO.Message")
    If Err.Number <> 0 Then
        SendEMail = False
        Exit Function
    End If
    Err.Clear
    On Error GoTo 0
    With MailMessage
        .Subject = Subject
        .From = FromAddress
        .To = Recips(NRecip)
        If MailBody <> vbNullString Then
            .TextBody = MailBody
        Else
            If BodyFileName <> vbNullString Then
                If Dir(BodyFileName, vbNormal) <> vbNullString Then
                    ' import the text of the body from file BodyFileName
                    FNum = FreeFile
                    S = vbNullString
                    Body = vbNullString
                    Open BodyFileName For Input Access Read As #FNum
                    Do Until EOF(FNum)
                        Line Input #FNum, S
                        Body = Body & vbNewLine & S
                    Loop
                    Close #FNum
                    .TextBody = Body
                Else
                    ' BodyFileName not found.
                    SendEMail = False
                    Exit Function
                End If
            End If ' MailBody and BodyFileName are both vbNullString.
        End If
        
        If IsArray(Attachments) = True Then
            ' attach all the files in the array.
            For N = LBound(Attachments) To UBound(Attachments)
                ' ensure the attachment file exists and attach it.
                If Attachments(N) <> vbNullString Then
                    If Dir(Attachments(N), vbNormal) <> vbNullString Then
                        .AddAttachment Attachments(N)
                    End If
                End If
            Next N
        Else
            ' ensure the file exists and if so, attach it to the message.
            If Attachments <> vbNullString Then
                If Dir(CStr(Attachments), vbNormal) <> vbNullString Then
                    .AddAttachment Attachments
                End If
            End If
        End If
        With .Configuration.Fields
            ' set up the SMTP configuration
            .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
            .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = SMTP_Server
            .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
            .Update
        End With
        
        On Error Resume Next
        Err.Clear
        ' Send the message
        .Send
        If Err.Number = 0 Then
            SendEMail = True
        Else
            SendEMail = False
            Exit Function
        End If
    End With
Next NRecip
SendEMail = True
End Function

Caso deseje anexar algum objeto, adicione:

ThisWorkbook.Save
ThisWorkbook.ChangeFileAccess xlReadOnly

B = SendEmail( _
    ... parameters ...
    Attachments:=ThisWorkbook.FullName)
ThisWorkbook.ChangeFileAccess xlReadWrite

Tags: VBA, excel, Sending, EMail, CDO, Attachments, Workbook, mail, e-mail, 

ReferenceCPerson

VBA Excel - Ordenando as Abas da sua Planilha - Sorting By Name And Ordering Worksheets In A Workbook



Pois é, estamos na versão 2013 da maior suíte de trabalho voltada para escritórios e ela ainda não contempla um mecanismo ou comando para ordenar as planilhas (sheets) dentro de um arquivo (workbook).

Com esta função, você pode classificar algumas ou todas as planilhas pelo nome, em qualquer ordem crescente ou decrescente.

Este código consiste em uma função que usa parâmetros para controlar o comportamento. Você precisa criar alguns procedimentos que levam as planilha à classificação.

ORDENANDO POR NOME

Public Function SortWorksheetsByName(ByVal FirstToSort As Long, _
                            ByVal LastToSort As Long, _
                            ByRef ErrorText As String, _
                            Optional ByVal SortDescending As Boolean = False, _
                            Optional ByVal Numeric As Boolean = False) As Boolean
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' SortWorksheetsByName
' This sorts the worskheets from FirstToSort to LastToSort by name
' in either ascending (default) or descending order. If successful,
' ErrorText is vbNullString and the function returns True. If
' unsuccessful, ErrorText gets the reason why the function failed
' and the function returns False. If you include the Numeric
' parameter and it is True, (1) all sheet names to be sorted
' must be numeric, and (2) the sort compares names as numbers, not
' text.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim M As Long
Dim N As Long
Dim WB As Workbook
Dim B As Boolean

Set WB = Worksheets.Parent
ErrorText = vbNullString

If WB.ProtectStructure = True Then
    ErrorText = "Workbook is protected."
    SortWorksheetsByName = False
End If
    
'''''''''''''''''''''''''''''''''''''''''''''''
' If First and Last are both 0, sort all sheets.
''''''''''''''''''''''''''''''''''''''''''''''
If (FirstToSort = 0) And (LastToSort = 0) Then
    FirstToSort = 1
    LastToSort = WB.Worksheets.Count
Else
    '''''''''''''''''''''''''''''''''''''''
    ' More than one sheet selected. We
    ' can sort only if the selected
    ' sheet are adjacent.
    '''''''''''''''''''''''''''''''''''''''
    B = TestFirstLastSort(FirstToSort, LastToSort, ErrorText)
    If B = False Then
        SortWorksheetsByName = False
        Exit Function
    End If
End If

If Numeric = True Then
    For N = FirstToSort To LastToSort
        If IsNumeric(WB.Worksheets(N).Name) = False Then
            ' can't sort non-numeric names
            ErrorText = "Not all sheets to sort have numeric names."
            SortWorksheetsByName = False
            Exit Function
        End If
    Next N
End If

'''''''''''''''''''''''''''''''''''''''''''''
' Do the sort, essentially a Bubble Sort.
'''''''''''''''''''''''''''''''''''''''''''''
For M = FirstToSort To LastToSort
    For N = M To LastToSort
        If SortDescending = True Then
            If Numeric = False Then
                If StrComp(WB.Worksheets(N).Name, WB.Worksheets(M).Name, vbTextCompare) > 0 Then
                    WB.Worksheets(N).Move before:=WB.Worksheets(M)
                End If
            Else
                If CLng(WB.Worksheets(N).Name) > CLng(WB.Worksheets(M).Name) Then
                    WB.Worksheets(N).Move before:=WB.Worksheets(M)
                End If
            End If
        Else
            If Numeric = False Then
                If StrComp(WB.Worksheets(N).Name, WB.Worksheets(M).Name, vbTextCompare) < 0 Then
                    WB.Worksheets(N).Move before:=WB.Worksheets(M)
                End If
            Else
                If CLng(WB.Worksheets(N).Name) < CLng(WB.Worksheets(M).Name) Then
                    WB.Worksheets(N).Move before:=WB.Worksheets(M)
                End If
            End If
        End If
    Next N
Next M

SortWorksheetsByName = True

End Function



Tags: VBA, excel, Sorting, Name, Ordering, Worksheets, Workbook

Reference: CPerson

diHITT - Notícias