Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Como realizar operações num MSHFlexgrid


LAMPIAOVALENTE2

Pergunta

Tenho um programa que realiza a importação dos dados para uma MSHFlexgrid (com a ajuda dos amigos aqui do fórum), conforme mostrado abaixo, agora necessito que seja realizado uma operação matemática, por exemplo, uma multiplicação simples por 2 em cada elemento de uma mesma coluna separadamente, e jogar por exemplo essa coluna numa outra MSHFlexgrid em um outro form. Desde já, gratos a todos pela ajuda,

Segue abaixo o programa que está importando os dados:

Private Sub Command1_Click()
    On Error GoTo TrataErro:
    
    Dim fso As New FileSystemObject
    Dim f As TextStream
    Dim l As String
    Dim v() As String
    Dim i As Currency
    Dim s As Currency
    
    CommonDialog1.ShowOpen

    Set f = fso.OpenTextFile(CommonDialog1.FileName, ForReading, False)
    
    MSHFlexGrid1.Clear
    
    l = f.ReadLine
    v = Split(l, ",")
    
    MSHFlexGrid1.Cols = UBound(v) + 1
    
    For i = 0 To UBound(v)
        MSHFlexGrid1.TextMatrix(1, i) = IIf(IsNumeric(v(i)), Val(v(i)), v(i))
        s = s + IIf(IsNumeric(v(i)), Val(v(i)), 0)
        
    Next

    Do While Not f.AtEndOfStream
        l = f.ReadLine
      
        v = Split(l, ",")
        
        MSHFlexGrid1.Rows = MSHFlexGrid1.Rows + 1
        
        For i = 0 To UBound(v)
            MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Rows - 1, i) = IIf(IsNumeric(v(i)), Val(v(i)), v(i))
            s = s + IIf(IsNumeric(v(i)), Val(v(i)), 0)
            
        Next
    Loop
    
    Exit Sub
TrataErro:
    'Erro que ocorre quando cancela um commondialog
    If Err.Number <> 32755 Then
        MsgBox Err.Number & " - " & Err.Description
    End If
End Sub

Editado por LAMPIAOVALENTE2
Adicionar tag CODE
Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Olá!

você pode fazer cálculos enquanto carrega a Grid

For i = 0 To UBound(v) 'Ubound(array) retona o tamanho de um Vetor
        'Multiplica coluna "i" por 2
        MSHFlexGrid1.TextMatrix(1, i) = IIf(IsNumeric(v(i)), Val(v(i)) * 2, v(i))        
    Next
Diga quais são os calculos que precisa para que possamos te ajudar melhor, exemplo precisa somar uma coluna ou linha, ou qual formula deve ser aplicada em cada campo. Lembrete: Existem 2 "For i = 0 To UBound(v)" você precisa alterar o código nos 2 Observação: Este script esta verificando se o valor é numerico:
IIf(IsNumeric(v(i)), Val(v(i)) * 2, v(i))
Se for numérico usa a função Val() para retirar os zeros a esquerda Se não for numérico, joga o valor na grid sem alterações. Caso você tenha certeza de que todos os arquivos contem valores numéricos, então não necessitara desta verificação. ou você pode deixar para verificação, exibindo uma mensagem de erro caso não seja numérico
Tenho um programa que realiza a importação dos dados para uma MSHFlexgrid (com a ajuda dos amigos aqui do fórum), conforme mostrado abaixo, agora necessito que seja realizado uma operação matemática, por exemplo, uma multiplicação simples por 2 em cada elemento de uma mesma coluna separadamente, e jogar por exemplo essa coluna numa outra MSHFlexgrid em um outro form. Desde já, gratos a todos pela ajuda, Segue abaixo o programa que está importando os dados:
Private Sub Command1_Click()
    On Error GoTo TrataErro:
    
    Dim fso As New FileSystemObject
    Dim f As TextStream
    Dim l As String
    Dim v() As String
    Dim i As Currency
    Dim s As Currency
    
    CommonDialog1.ShowOpen

    Set f = fso.OpenTextFile(CommonDialog1.FileName, ForReading, False)
    
    MSHFlexGrid1.Clear
    
    l = f.ReadLine
    v = Split(l, ",")
    
    MSHFlexGrid1.Cols = UBound(v) + 1
    
    For i = 0 To UBound(v)
        MSHFlexGrid1.TextMatrix(1, i) = IIf(IsNumeric(v(i)), Val(v(i)), v(i))
        s = s + IIf(IsNumeric(v(i)), Val(v(i)), 0)
        
    Next

    Do While Not f.AtEndOfStream
        l = f.ReadLine
      
        v = Split(l, ",")
        
        MSHFlexGrid1.Rows = MSHFlexGrid1.Rows + 1
        
        For i = 0 To UBound(v)
            MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Rows - 1, i) = IIf(IsNumeric(v(i)), Val(v(i)), v(i))
            s = s + IIf(IsNumeric(v(i)), Val(v(i)), 0)
            
        Next
    Loop
    
    Exit Sub
TrataErro:
    'Erro que ocorre quando cancela um commondialog
    If Err.Number <> 32755 Then
        MsgBox Err.Number & " - " & Err.Description
    End If
End Sub

Link para o comentário
Compartilhar em outros sites

  • 0

Como fazer para multiplicar por 2 todos os elementos de uma mesma coluna?

Do jeito você postou,imagino que estará multiplicando todos os elementos da matriz por 2 e não necessito disso, necessito por exemplo multiplicar uma coluna por 2 e outra coluna ao mesmo tempo por 3, por exemplo e jogar em outra mshflexgrid. Com esse exemplo, usarei uma aplicação mais complexa, no ramo da física, como um fourier, etc. Mas para uma aplicação mais complexa, precisaria entender uma mais simples.

Desde já, grato pela atenção.

Olá!

você pode fazer cálculos enquanto carrega a Grid

For i = 0 To UBound(v) 'Ubound(array) retona o tamanho de um Vetor
        'Multiplica coluna "i" por 2
        MSHFlexGrid1.TextMatrix(1, i) = IIf(IsNumeric(v(i)), Val(v(i)) * 2, v(i))        
    Next
Diga quais são os calculos que precisa para que possamos te ajudar melhor, exemplo precisa somar uma coluna ou linha, ou qual formula deve ser aplicada em cada campo. Lembrete: Existem 2 "For i = 0 To UBound(v)" você precisa alterar o código nos 2 Observação: Este script esta verificando se o valor é numerico:
IIf(IsNumeric(v(i)), Val(v(i)) * 2, v(i))
Se for numérico usa a função Val() para retirar os zeros a esquerda Se não for numérico, joga o valor na grid sem alterações. Caso você tenha certeza de que todos os arquivos contem valores numéricos, então não necessitara desta verificação. ou você pode deixar para verificação, exibindo uma mensagem de erro caso não seja numérico
Tenho um programa que realiza a importação dos dados para uma MSHFlexgrid (com a ajuda dos amigos aqui do fórum), conforme mostrado abaixo, agora necessito que seja realizado uma operação matemática, por exemplo, uma multiplicação simples por 2 em cada elemento de uma mesma coluna separadamente, e jogar por exemplo essa coluna numa outra MSHFlexgrid em um outro form. Desde já, gratos a todos pela ajuda, Segue abaixo o programa que está importando os dados:
Private Sub Command1_Click()
    On Error GoTo TrataErro:
    
    Dim fso As New FileSystemObject
    Dim f As TextStream
    Dim l As String
    Dim v() As String
    Dim i As Currency
    Dim s As Currency
    
    CommonDialog1.ShowOpen

    Set f = fso.OpenTextFile(CommonDialog1.FileName, ForReading, False)
    
    MSHFlexGrid1.Clear
    
    l = f.ReadLine
    v = Split(l, ",")
    
    MSHFlexGrid1.Cols = UBound(v) + 1
    
    For i = 0 To UBound(v)
        MSHFlexGrid1.TextMatrix(1, i) = IIf(IsNumeric(v(i)), Val(v(i)), v(i))
        s = s + IIf(IsNumeric(v(i)), Val(v(i)), 0)
        
    Next

    Do While Not f.AtEndOfStream
        l = f.ReadLine
      
        v = Split(l, ",")
        
        MSHFlexGrid1.Rows = MSHFlexGrid1.Rows + 1
        
        For i = 0 To UBound(v)
            MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Rows - 1, i) = IIf(IsNumeric(v(i)), Val(v(i)), v(i))
            s = s + IIf(IsNumeric(v(i)), Val(v(i)), 0)
            
        Next
    Loop
    
    Exit Sub
TrataErro:
    'Erro que ocorre quando cancela um commondialog
    If Err.Number <> 32755 Then
        MsgBox Err.Number & " - " & Err.Description
    End If
End Sub

Link para o comentário
Compartilhar em outros sites

  • 0
Como fazer para multiplicar por 2 todos os elementos de uma mesma coluna?

Do jeito você postou,imagino que estará multiplicando todos os elementos da matriz por 2 e não necessito disso, necessito por exemplo multiplicar uma coluna por 2 e outra coluna ao mesmo tempo por 3, por exemplo e jogar em outra mshflexgrid. Com esse exemplo, usarei uma aplicação mais complexa, no ramo da física, como um fourier, etc. Mas para uma aplicação mais complexa, precisaria entender uma mais simples.

Desde já, grato pela atenção.

Option Explicit

'By: Anderson Fernandes do Nascimento
'Date: 17/11/2010 10:47

'Faça referencia:
'-Microsoft Scripting Runtime
'Faça referencia aos componentes:
'-Microsoft Commoon Dialog Control 6.0 (SP6)
'-Microsoft Hierarchical FlexGrid Control 6.0 (SP6) (OLEDB)
'
'Adicione no formulario
'-MSHFlexGrid com o nome Grid1
'-Um menu Abrir com o nome MnuAbrir
'-Um menu Calular com o nome MnuCalc1
'CommonDialog com o nome Dlg1

'Deixei tudo no jeito para você ter que se preoculpar apenas com os calculos
'Criei a Sub Calc1 para demonstrar como efetuar os calculos

Private Matriz() As Variant

Private Sub Form_Load()
    With Grid1
        .FixedCols = 0
        .FixedRows = 0
        .Cols = 0
        .Rows = 0
    End With
End Sub

'Menu Abrir
Private Sub MnuAbrir_Click()
    On Error GoTo TrataErro
    
    Dlg1.Filter = "Todos os Arquivos (*.*)|*.*|Arquivos DAT (*.dat)|*.dat"
    Dlg1.ShowOpen
    
    Call LoadMatrizFromFile(Dlg1.FileName)
    
    Call LoadGridFromMatriz(Matriz)
    
    Exit Sub
TrataErro:
    'Erro que ocorre quando cancela um CommonDialog
    If Err.Number <> 32755 Then
        MsgBox Err.Number & " - " & Err.Description
    End If
End Sub

'Menu Calculo 1
Private Sub MnuCalc1_Click()
    Call Calc1
End Sub


'Carrega a arquivo em um vetor para aumentar o desenpenho
'deste carregamento e de calculos posteriores.
Private Sub LoadMatrizFromFile(ByVal File As String)
    On Error GoTo TrataErro
    
    Dim fso As New FileSystemObject
    Dim f As TextStream
    Dim l As String
    Dim v() As String
    Dim i As Currency
    Dim s As Currency
    Dim mCol As Integer
    Dim mLin As Integer

    Set f = fso.OpenTextFile(File, ForReading, False)

    'Limpa a Matriz
    ReDim Matriz(0)

    'Enquanto não for o final do arquivo faça
    Do While Not f.AtEndOfStream
        'ler linha
        l = f.ReadLine
        
        'Divide a linha nas virgulas e joga no vetor auxiliar
        v = Split(l, ",")
        
        If Grid1.Cols < UBound(v) + 1 Then Grid1.Cols = UBound(v) + 1
        
        'Redimensiona Matriz preservando os valores
        ReDim Preserve Matriz(mLin)
        
        'Acrescenta Colunas na ultima linha
        Matriz(mLin) = v()
        
        mLin = mLin + 1 'Acrescenta linha
        
        DoEvents
    Loop
    
    Exit Sub
TrataErro:
    MsgBox Err.Number & " - " & Err.Description
End Sub

'Carrega Grid a partir da Matrz na memoria
Private Sub LoadGridFromMatriz(ByVal vMatriz As Variant)
On Error GoTo TrataErro

    Dim v As Variant
    Dim n As Variant
    Dim c As Integer
    
    Grid1.Clear
    Grid1.Rows = 0
    
    For Each v In vMatriz 'Linhas
        Grid1.Rows = Grid1.Rows + 1
        For Each n In v 'Colunas
            Grid1.TextMatrix(Grid1.Rows - 1, c) = Val(n)
            c = c + 1
        Next
        c = 0
        DoEvents
    Next

 Exit Sub
TrataErro:
    MsgBox Err.Number & " - " & Err.Description
End Sub


'Exemplo de Calculo utilizando a matriz já carregada com o arquivo
Private Sub Calc1()
    Dim Matriz2() As Variant
    
    'Clona a matriz
    Matriz2 = Matriz

    'Exemplo simples de como obter e alterar o valor de uma celula
    'Pega o valor da linha 1 coluna 1 e multiplica pelo valor 2
    Call SetVal(0, 0, Matriz2, GetVal(0, 0, Matriz) * 2)
    
    Dim i As Integer
    Dim l As Integer
    
    l = CountLinhas(Matriz) 'Salvo o numero de linhas em uma variavel para aumento de desempenho
    
    'Soma os valores da coluna 2 com a coluna 3 e joga o resultado na coluna 1
    'Observação: o vetor começa do Zero, por isso subtraia 1 no numero da coluna que deseja obter
    'Exemplo: para obter a coluna/linha 1 o indice 0, para obter da coluna/linha 100 o indice é 99
    
    For i = 0 To l 'Varre todas as linhas
        Call SetVal(i, 0, Matriz2, GetVal(i, 1, Matriz) + GetVal(i, 2, Matriz))
    Next
    
    Call LoadGridFromMatriz(Matriz2)
    
    'Observe que foi feito calculos sem alterar a Matriz original evitando assim recarregar o arquivo
    'proporcionando um aumento de desempenho
    
End Sub

'Retorna o numero de linhas em uma matriz
Private Function CountLinhas(ByVal auxMatriz As Variant) As Integer
    CountLinhas = UBound(auxMatriz)
End Function

'Retorna o numero de Colunas em uma matriz
Private Function CountColunas(ByVal auxMatriz As Variant) As Integer
    Dim v As Variant
    
    v = auxMatriz(0)

    CountLinhas = UBound(v)
End Function

'Retorna o valor de uma Celula de uma matriz
Private Function GetVal(ByVal Linha As Integer, ByVal Coluna As Integer, ByVal auxMatriz As Variant) As Double
    Dim v As Variant
    
    v = auxMatriz(Linha)
    
    GetVal = Val(v(Coluna))
End Function

'Altera o valor de uma celula em uma matriz
Private Sub SetVal(ByVal Linha As Integer, ByVal Coluna As Integer, ByRef auxMatriz As Variant, ByVal Valor As Double)
    Dim v As Variant
    
    v = auxMatriz(Linha)
    
    v(Coluna) = Valor
    
    auxMatriz(Linha) = v
End Sub

Este tópico é continuação de:

http://scriptbrasil.com.br/forum/index.php?showtopic=155707

Editado por Anderson Fernandes
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...