MSFlexGridでデータを貼り付けするには?

解決


聖二  2004-06-21 18:01:26  No: 84138  IP: [192.*.*.*]

みなさま、お世話になります。またよろしくお願いいたします。

MSFlexGridでデータを貼り付けるために、以下のような
コードを書いています。
このとき、エクセルからコピーし貼り付ける場合はうまくいくのですが
MSFlexGridのデータをコピーし、貼り付ける場合は、
1行分少なくなってしまいます。
また、MSFlexGridから1セルだけコピーする場合は、
貼り付ける場所より、一つ上のセルに入ってしまいます。
エクセルからのコピーではうまくいきます。

どう対処したらいいでしょうか。
よろしくご指導お願いいたします。

Private Sub Edit_Copy_Click()
'コピー

    Dim TempText As String
    
    TempText = MSFlexGrid1.Clip
    Clipboard.Clear
    Clipboard.SetText TempText
    
End Sub

Private Sub Edit_Paste_Click()
'貼り付け

    Dim TempText As String
    Dim IRow As Integer
    Dim ICol As Integer
    
    IRow = 0
    ICol = 0
    
    TempText = Clipboard.GetText
    
    'データの行数、列数を得る
    Search TempText, IRow, ICol
    
    'IColは実際の列数よりも、1小さい
    With MSFlexGrid1
        If .Row + IRow <= .Rows And .Col + ICol < .Cols Then
            .RowSel = .Row + IRow - 1
            .ColSel = .Col + ICol
            .Clip = TempText
        Else
            MsgBox "貼り付け先が範囲外です", vbOKOnly, "警告"
        End If
    End With
    
End Sub
Private Sub Search(ByVal Temp As String, r As Integer, C As Integer)
'データの行数、列数を得る

    Dim TmpString As String
    
    '1行分の文字列を得るChr(13)=リターン
    TmpString = Left(Temp, InStr(Temp, Chr(13)))
    
    '列数を得る
    'Chr(9)=タブ
    Do Until InStr(TmpString, Chr(9)) = 0
        C = C + 1
        TmpString = Mid(TmpString, InStr(TmpString, Chr(9)) + 1)
    Loop
    
    '行数を得る
    Do Until InStr(Temp, Chr(13)) = 0
        r = r + 1
        Temp = Mid(Temp, InStr(Temp, Chr(13)) + 1)
    Loop

End Sub

編集 削除
YRYR  2004-06-22 12:15:28  No: 84139  IP: [192.*.*.*]

TempTextの内容を調べれば分かるんじゃないですか?

編集 削除
聖二  2004-06-26 10:15:37  No: 84140  IP: [192.*.*.*]

なんとか、自分で解決出来ました。
要するに、MSFlexGridからMSFlexGridへの
コピー時に、動作が変なので、以下のようにしてあります。
MSFlexGridからエクセルへのコピーは、今までのコードで正常に行っています。
その他、若干コードは分かりやすくいたしました。
ご参考にしてください。

Dim GridTemp As String

Private Sub Edit_Copy_Click()
'コピー

    Dim TempText As String
    
    TempText = MSFlexGrid1.Clip
    Clipboard.Clear
    Clipboard.SetText TempText
    
    'MSFlexGridからコピーの場合、一時保存
    GridTemp = TempText
    
End Sub

Private Sub Edit_Paste_Click()
'貼り付け

    Dim TempText As String
    Dim IRow As Integer
    Dim ICol As Integer
    
    IRow = 1
    ICol = 1

    TempText = Clipboard.GetText
    
    'データの行数、列数を得る
    Search TempText, IRow, ICol
    
    '範囲を指定し、貼り付け
    With MSFlexGrid1
        If .Row + IRow <= .Rows And .Col + ICol <= .Cols Then
            .RowSel = .Row + IRow - 1
            .ColSel = .Col + ICol - 1
            .Clip = TempText
        Else
            MsgBox "貼り付け先が範囲外です", vbOKOnly, "警告"
        End If
    End With
    
End Sub
Private Sub Search(ByVal Temp As String, r As Integer, C As Integer)
'データの行数、列数を得る

    Dim TmpString As String
    Dim MyTemp As String
    
    '貼り付けデータの一時保存
    MyTemp = Temp
    
    '1行分の文字列を得る  Chr(13)=リターン
    TmpString = Left(Temp, InStr(Temp, Chr(13)))
    
    '列数を得る    Chr(9)=タブ
    Do Until InStr(TmpString, Chr(9)) = 0
        TmpString = Mid(TmpString, InStr(TmpString, Chr(9)) + 1)
        C = C + 1
    Loop
    
    '行数を得る
    Do Until InStr(Temp, Chr(13)) = 0
        Temp = Mid(Temp, InStr(Temp, Chr(13)) + 1)
        r = r + 1
    Loop
    
    r = r - 1
    
    'MSFlexGridからのコピーの場合
    If MyTemp = GridTemp Then
        r = r + 1
        If r = 1 Then
            '列数を得る
            Do Until InStr(MyTemp, Chr(9)) = 0
                MyTemp = Mid(MyTemp, InStr(MyTemp, Chr(9)) + 1)
                C = C + 1
            Loop
        End If
    End If
    
End Sub

編集 削除