Results 1 to 15 of 15

Generate Venn diagrams with multiple data

Threaded View

  1. #8
    Forum Guru xladept's Avatar
    Join Date
    04-14-2012
    Location
    Pasadena, California
    MS-Off Ver
    Excel 2003,2010
    Posts
    12,378

    Re: Generate Venn diagrams with multiple data

    Hi Abousetta,

    I'm making some headway - I figured that there would be just one offset between any two circles, and the way to nail it would be in the combinations - so here's a way to get the offsets:

    Sub TestGO()
    Call GetOff(1585, 927, 2031733) 'V1,V2=1298
    Call GetOff(1585, 170, 40063)   'V1,V3=1578
    Call GetOff(1585, 87, 12113)    'V1,V4=1583
    Call GetOff(927, 170, 13359)    'V2,V3=913
    Call GetOff(927, 87, 4790)      'V2,V4=923
    Call GetOff(170, 87, 12113)     'V3,V4=147
    End Sub
    
    Function GetOff(R1 As Single, R2 As Single, A As Single) As Single
    Dim WF As WorksheetFunction, T As Single, Pi As Single, X As Single
    Set WF = WorksheetFunction: Pi = WF.Pi
    For T = 0.01 To 2 * Pi Step 0.02
    If Abs(R1 / R2 * Sin(T)) > 1 Then
    GoTo GetNext: End If
    X = (R1 ^ 2 * (T - Sin(T)) + R2 ^ 2 * WF.Asin(R1 / R2 * Sin(T)) - R1 * R2 * Sin(T))
    If X >= 2 * A Then
    Exit For: End If
    GetNext: Next T
    GetOff = Sqr(R1 ^ 2 * (1 - Sin(T) ^ 2) + Sqr(R2 ^ 2 - R1 ^ 2 * Sin(T) ^ 2))
    End Function
    Sub VennEm(): Dim s As Integer, i As Long, j As Long, Origin As Range
    Dim R As Single, X As Single, Y As Single, OL As Single, OT As Single
    Dim L As Single, T As Single, W As Single, H As Single
    
    Set Origin = Range("J14"): OL = Origin.Left: OT = Origin.Top: s = 10
    
    For i = 3 To 6
    R = CSng(Range("C" & i) / s): X = CSng(Range("D" & i) / s): Y = CSng(Range("E" & i) / s)
    L = OL + X - R: T = OT - Y - R: W = 2 * R: H = 2 * R
    
    Call VC(L, T, W, H)
    
    Next i
    End Sub
    Sub VC(L As Single, T As Single, W As Single, H As Single):
    
    Dim O As MsoShapeType
    Dim ws As Worksheet: Set ws = ActiveSheet: O = msoShapeOval
    
    ws.Shapes.AddShape(O, L, T, W, H).Select
    Selection.ShapeRange.Fill.Visible = msoTrue
    Selection.ShapeRange.Fill.Transparency = 0.73
    
    End Sub
    It's getting more correct This is almost what it should look like:Abousetta1.jpg
    Last edited by xladept; 04-19-2013 at 10:46 PM.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts

Search Engine Friendly URLs by vBSEO 3.6.0 RC 1